ByVal dans une fonction VB.NET ? [Résolu]

Messages postés
2117
Date d'inscription
lundi 11 avril 2005
Dernière intervention
14 mars 2016
- - Dernière réponse : us_30
Messages postés
2117
Date d'inscription
lundi 11 avril 2005
Dernière intervention
14 mars 2016
- 10 août 2010 à 22:51
Bonjour,

Ma question porte sur le comportement de ByVal dans une fonction sous VB.NET (VB2010). Habitué à la programmation sous VBA/VB6, le comportement de ByVal me semble différent sous VB.NET... IL se comporte comme un ByRef sous VB6 ???

Voici un exemple en raccourci :

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        Dim tab(3) As String
        tab(1) = "1"
        tab(2) = "3"
        tab(3) = "2"

        Essai(tab)

        For t = 1 To 3
            MessageBox.Show(tab(t))
        Next


End Sub


 Function Essai(ByVal ParamArray Tableau() As String) As Double


        System.Array.Sort(Tableau)
        Essai = 10

End Function


Ma Question : Comment faire pour obtenir un comportement "normal" de byval ??? C'est à dire que tab(t) ne soit pas triée, mais reste comme elle a été passée ?

Je sèche... Est-il obligatoire de passer par la création d'un nouveau objet ? auquel cas à quoi ByVal alors ?

Je n'ai pas vu de piste sur le forum... une idée ?

Amicalement,
Us.
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
14324
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
18 décembre 2018
3
Merci
Bonjour,

Function Essai(ByVal ParamArray Tableau() As String) As Double
        System.Array.Sort(Tableau)
        Essai = 10
End Function


Alors, la, tu trie le tableau, donc il est trié, Si tu veux avoir 2 instances du tableau (une triée et l'autre pas) :
Dim lLst as new list(of String)
llst.addrange(Tableau)


ensuite pour reprendre un tableau :
lLst.ToArray()

Mais le ByVal, ne copie par valeur que le paramètre, ensuiite, si tu le modifie dans la focntion qui l'utilise, tu aura altérée la donnée.

Note :
Evite :
Essai = 10
Mais préfère utiliser Return

Mon site

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 95 internautes nous ont dit merci ce mois-ci

Commenter la réponse de NHenry
Messages postés
2117
Date d'inscription
lundi 11 avril 2005
Dernière intervention
14 mars 2016
0
Merci
Okay, merci beaucoup... Ton bout code résout bien mon problème.

[i]Au cas où cela intéresserait une autre personne :

J'ai trouvé l'explication : Sous VB.NET les objets sont toujours passés en référence (sans autre possibilité) donc en ByRef... mais reste que VB.NET donne aucune indication d'erreur ou d'alerte si on écrit ByVal... (c'est encore une logique à Microsoft ). Un tableau de variables étant un objet sous VB.NET...

Contrairement aux variables (simples) qui peuvent se passer en Byval ou Byref...

IL faut donc créer un nouveau objet (avec NEW) qui soit une copie (et non pas un pointeur... ouais, bon, après c'est de la tabouille où j'essaye seulement de surnager...)

Dans mon cas sur cet exemple, pour obtenir, donc, un résultat similaire à ByVal sous VB6, cela donne :
/i
    Function Essai(ByRef Tableau() As String) As Double

        Dim lLst as new list(of String)
        lLst.AddRange(Tableau)
        lLst.Sort()

        Return 10

    End Function



Ceci étant, je pense avoir un peu compris (et pas trop dire d'ânerie), mais j'aurais mis beaucoup plus temps à trouver tout seul.
Encore merci NHenry.

Amicalement,
Us.
Commenter la réponse de us_30
Messages postés
14324
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
18 décembre 2018
0
Merci
Bonjour,

Pour information, les objet sont passés par référence, pourtant il y a une différence :

Si on appel une function/sub de cette manière :

MaFonction(MonObjet)

Si c'est déclaré comme ça :
Function MaFonction(Byval pObj as TypeObjet)

Et que dedans tu fais :
pObj=New TypeObjet()

MonObjet sera inchangé

Alors que si tu utilises ByRef, MonObjet sera changé.

Pour être plus clair, ByVal ou ByRef sur un objet, indique simplement si la référence vers l'objet est passée en ByRef ou ByVal, mais n'est pas copié.

Cela s'explique simplement avec des connaissance en C++ :
Un objet étant référencé par un pointeur, on passe en paramètre le pointeur et pas l'objet.

j'espère que ça éclairera ta lanterne :)

Mon site
Commenter la réponse de NHenry
Messages postés
2117
Date d'inscription
lundi 11 avril 2005
Dernière intervention
14 mars 2016
0
Merci
Re,

Ma lanterne est éclairée à 50%...

En fait c'est à la fin que je décroche. Il me manque surement des notions... surtout quand tu parles de "référence vers l'objet". JE ne vois pas l'intérêt ? Pour moi, on travaille sur les objets au final, soit on a besoin qu'ils se modifient ou ne se modifient pas... Et en définitive, la référence n'est qu'un accessoire... De plus, si je regardes bien "pObj" devient un objet avec "New TypeObjet()". Nan ? Donc, peut-on dire que la "référence vers l'objet" devient "l'objet". C'est le brouillard que ma lanterne n'éclaire qu'un peu...

Je n'ai touché au C++ ou au VB.NET que trop peu pour bien cerner le bien fondé du (drôle) ByVal en VB.NET... Je retiens ta structure de code, ce qui l'essentiel en pratique...

Amicalement,
Us.
Commenter la réponse de us_30
Messages postés
14324
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
18 décembre 2018
0
Merci
Bonjour,

Non, c'est la référence vers l'objet qui est passée par référence ou par valeur, l'objet n'existe qu'une seule fois et n'est pas copié avant le passage dans la fonction.

Pour plus d'éclaircissement, je pense que un peu de C++ et de manipulation des pointeurs est une base indispensable.

Mon site
Commenter la réponse de NHenry
Messages postés
2117
Date d'inscription
lundi 11 avril 2005
Dernière intervention
14 mars 2016
0
Merci
Oui probablement, car ce que dit peut s'interpréter de deux façons. Ce qui me laisse perplexe. Il me manque une "bonne notion" pour bien te cerner... Je verrai un peu plus tard.

Merci encore pour ton aide,

Amicalement,
Us.
Commenter la réponse de us_30

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.