ByVal dans une fonction VB.NET ?

Résolu
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 - 8 août 2010 à 14:58
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre 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.

6 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
8 août 2010 à 15:19
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
3
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
8 août 2010 à 15:45
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.
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
8 août 2010 à 17:05
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
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
8 août 2010 à 18:08
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
10 août 2010 à 22:32
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
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
10 août 2010 à 22:51
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.
0
Rejoignez-nous