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

us_30 2117 Messages postés lundi 11 avril 2005Date d'inscription 14 mars 2016 Dernière intervention - 8 août 2010 à 14:58 - Dernière réponse : us_30 2117 Messages postés lundi 11 avril 2005Date d'inscription 14 mars 2016 Dernière intervention
- 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
NHenry 14250 Messages postés vendredi 14 mars 2003Date d'inscription 10 août 2018 Dernière intervention - 8 août 2010 à 15:19
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

Merci NHenry 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de NHenry
us_30 2117 Messages postés lundi 11 avril 2005Date d'inscription 14 mars 2016 Dernière intervention - 8 août 2010 à 15:45
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
NHenry 14250 Messages postés vendredi 14 mars 2003Date d'inscription 10 août 2018 Dernière intervention - 8 août 2010 à 17:05
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
us_30 2117 Messages postés lundi 11 avril 2005Date d'inscription 14 mars 2016 Dernière intervention - 8 août 2010 à 18:08
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
NHenry 14250 Messages postés vendredi 14 mars 2003Date d'inscription 10 août 2018 Dernière intervention - 10 août 2010 à 22:32
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
us_30 2117 Messages postés lundi 11 avril 2005Date d'inscription 14 mars 2016 Dernière intervention - 10 août 2010 à 22:51
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.