Le modificateur ByVal désigne le passage d'un paramètre à une procédure ou une fonction par valeur. En Visual Basic, ByVal est utilisé par défaut et garantit que les modifications apportées au paramètre à l'intérieur de la procédure n'affectent pas la variable d'origine transmise par l'appelant.
Dans les versions classiques de VB, tout paramètre pouvait être passé de deux manières : par valeur ou par référence. Avec l'évolution du langage et l'apparition de types de données complexes (structures, classes), l'importance de faire un choix conscient entre ByVal et ByRef a augmenté.
Un choix erroné du mode de passage du paramètre conduit souvent à des erreurs : on peut involontairement modifier une variable de code appelant, ou au contraire - attendre des modifications qui ne se produiront pas.
ByVal est utilisé lorsque la procédure doit travailler avec une copie de la valeur. Il est utilisé pour passer des types primitifs, des structures, parfois même des types de référence, si la préservation de la référence est importante.
Exemple de code :
Sub Increment(ByVal number As Integer) number += 1 End Sub Dim myValue As Integer = 10 Increment(myValue) Console.WriteLine(myValue) ' Retournera 10, pas 11
Caractéristiques clés :
Comment se comporterait un objet (par exemple, une instance de classe) s'il était passé avec le modificateur ByVal ?
Réponse : Une copie de la référence à l'objet est transmise, et non l'objet lui-même. On peut modifier les champs de l'objet depuis la procédure - les modifications seront visibles de l'extérieur. C'est la référence, et non l'objet, qui ne peut pas être remplacée par un nouveau à l'intérieur de la procédure avec effet pour le code appelant.
Exemple de code :
Class Counters Public Value As Integer End Class Sub ModifyCounter(ByVal c As Counters) c.Value = 999 ' Change la propriété ! c = New Counters() ' Ce changement n'est pas visible pour le code appelant End Sub Dim example As New Counters() ModifyCounter(example) Console.WriteLine(example.Value) ' Affichera 999
La valeur d'une structure changera-t-elle lors du passage de ByVal, si ses champs sont modifiés à l'intérieur de la procédure ?
Réponse : Non, toute l'instance de la structure est copiée, et les modifications ne sortent pas. Chaque enregistrement de la structure, par exemple, Point, dans la procédure est le sien.
Est-il obligatoire de spécifier explicitement ByVal pour un paramètre ?
Réponse : Non, ByVal est utilisé par défaut, la spécification explicite est seulement pour une meilleure lisibilité et le respect du style de codage.
Un développeur passe un tableau ByVal à une fonction, s'attendant à ce que les éléments puissent être ajoutés au tableau et qu'un nouveau tableau apparaisse du côté appelant (de facto, le Type de Référence est passé par référence).
Avantages :
Inconvénients :
Pour passer un index de tableau, qui ne doit pas être modifié par la fonction, ByVal est utilisé. Même si la valeur de l'index est modifiée à l'intérieur, la variable d'origine reste intacte.
Avantages :
Inconvénients :