Partager via


Guide pratique pour protéger un argument de procédure contre les modifications de valeur (Visual Basic)

Si une procédure déclare un paramètre en tant que 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 ByVal correspondant 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 How to : Force an Argument to Be Passed by Value.

Exemple :

L’exemple suivant montre deux procédures qui prennent une variable de tableau et fonctionnent sur ses éléments. La increase procédure en ajoute simplement une à chaque élément. La replace procédure affecte 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 MsgBox appel affiche « After replace(n) : 11, 21, 31, 41 ». Comme n il est passé ByVal, replace ne peut pas modifier la variable n dans le code appelant en lui affectant un nouveau tableau. Lorsque vous replace créez la nouvelle instance k de tableau et l’attribue à la variable alocale, elle perd la référence à n passer par le code appelant. Lorsqu’il modifie les membres, aseul le tableau k local 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