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
- Procédures
- Paramètres et arguments d’une procédure
- Comment : passer des arguments à une procédure
- Passage des arguments par valeur et par référence
- Différences entre les arguments modifiables et non modifiables
- Différences entre le passage d'un argument par valeur et par référence
- Comment : modifier la valeur d’un argument de la procédure
- Comment : forcer le passage d'un argument par valeur
- Passage des arguments par position et par nom
- Value Types and Reference Types