Comment : protéger un argument de procédure contre les modifications de valeur (Visual Basic)

Si une procédure déclare un paramètre comme ByRef, Visual Basic donne au code de procédure une référence directe à l’élément de programmation sous-jacent à l’argument dans le code appelant. Cela permet à la procédure de modifier la valeur sous-jacente de l’argument dans le code appelant. Dans certains cas, le code appelant peut vouloir se protéger contre une telle modification.

Vous pouvez toujours protéger un argument contre la modification en déclarant le paramètre correspondant ByVal dans la procédure. Si vous souhaitez pouvoir modifier un argument donné dans certains cas, mais pas d’autres, vous pouvez le déclarer ByRef et laisser le code appelant déterminer le mécanisme de passage dans chaque appel. Pour ce faire, placez l’argument correspondant entre parenthèses pour le passer par valeur, ou ne l’mettez pas entre parenthèses pour le transmettre par référence. Pour plus d’informations, consultez Guide pratique pour forcer le passage d’un argument par valeur.

Exemple

L’exemple suivant montre deux procédures qui prennent une variable de tableau et fonctionnent sur ses éléments. La procédure increase en ajoute simplement une à chaque élément. La procédure replace attribue un nouveau tableau au paramètre a(), puis en ajoute un à chaque élément. Toutefois, la réaffectation n’affecte pas la variable de tableau sous-jacente dans le code appelant.

Public Sub increase(ByVal a() As Long)
    For j As Integer = 0 To UBound(a)
        a(j) = a(j) + 1
    Next j
End Sub
Public Sub replace(ByVal a() As Long)
    Dim k() As Long = {100, 200, 300}
    a = k
    For j As Integer = 0 To UBound(a)
        a(j) = a(j) + 1
    Next j
End Sub
Dim n() As Long = {10, 20, 30, 40}
Call increase(n)
MsgBox("After increase(n): " & CStr(n(0)) & ", " & 
    CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
Call replace(n)
MsgBox("After replace(n): " & CStr(n(0)) & ", " & 
    CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))

Le premier appel MsgBox affiche « After increase(n): 11, 21, 31, 41 ». Étant donné que le tableau n est un type référence, increase peut modifier ses membres, même si le mécanisme de passage est ByVal.

Le deuxième appel MsgBox affiche « After replace(n) : 11, 21, 31, 41 ». Étant donné que n est passé ByVal, replace ne peut pas modifier la variable n dans le code appelant en lui affectant un nouveau tableau. Lorsque replace crée la nouvelle instance de tableau k et l’affecte à la variable locale a, elle perd la référence à n passée par le code appelant. Lorsqu’il modifie les membres de a, seul le tableau local k est affecté. Par conséquent, replace n’incrémente pas les valeurs du tableau n dans le code appelant.

Compiler le code

La valeur par défaut dans Visual Basic consiste à passer des arguments par valeur. Toutefois, il est recommandé d’inclure le mot clé ByVal ou ByRef avec chaque paramètre déclaré. Cela facilite la lecture de votre code.

Voir aussi