us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 2016
-
8 août 2010 à 14:58
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 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 ?
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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.
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
NHenry
Messages postés15101Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention24 mars 2024159 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.
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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.