Gewusst wie: Schützen eines Prozedurarguments gegen Wertänderungen (Visual Basic)
Wenn eine Prozedur einen Parameter als ByRefdeklariert, gibt Visual Basic dem Prozedurcode einen direkten Verweis auf das Programmierelement, das dem Argument im aufrufenden Code zugrunde liegt. Dadurch kann die Prozedur den Wert ändern, der dem Argument im aufrufenden Code zugrunde liegt. In einigen Fällen möchte der aufrufende Code möglicherweise vor einer solchen Änderung schützen.
Sie können ein Argument jederzeit vor Änderungen schützen, indem Sie den entsprechenden Parameter ByVal in der Prozedur deklarieren. Wenn Sie ein bestimmtes Argument in einigen Fällen, aber nicht in anderen Fällen ändern möchten, können Sie es ByRef
deklarieren und den aufrufenden Code den Übergabemechanismus in jedem Aufruf bestimmen lassen. Dies geschieht, indem das entsprechende Argument in Klammern eingeschlossen wird, um es nach Wert zu übergeben, oder es nicht in Klammern einschließen, um es per Verweis zu übergeben. Weitere Informationen finden Sie unter Erzwingen, dass ein Argument als Wert übergeben wird.
Beispiel
Das folgende Beispiel zeigt zwei Prozeduren, die eine Arrayvariable annehmen und mit ihren Elementen arbeiten. Die increase
-Prozedur fügt jedem Element einfach Eins hinzu. Die replace
Prozedur weist dem Parameter a()
ein neues Array zu und fügt dann jedem Element Eins hinzu. Die Neuzuordnung wirkt sich jedoch nicht auf die zugrunde liegende Arrayvariable im aufrufenden Code aus.
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)))
Der erste MsgBox
-Aufruf zeigt „After increase(n): 11, 21, 31, 41“ an. Weil das Array n
ein Verweistyp ist, kann increase
seine Member ändern, obwohl der Übergabemechanismus ByVal
ist.
Der zweite MsgBox
-Aufruf zeigt „After replace(n): 11, 21, 31, 41“ an. Da n
übergeben ByVal
wird, replace
kann die Variable n
im aufrufenden Code nicht geändert werden, indem sie ihm ein neues Array zuweist. Wenn replace
sie die neue Arrayinstanz k
erstellt und der lokalen Variablen a
zugewiesen wird, verliert sie den Verweis, n
der vom aufrufenden Code übergeben werden soll. Wenn die Member geändert a
werden, ist nur das lokale Array k
betroffen. replace
erhöht daher nicht die Werte des Arrays n
im aufrufenden Code.
Kompilieren des Codes
Die Standardeinstellung in Visual Basic besteht darin, Argumente nach Wert zu übergeben. Es ist jedoch gute Programmierpraxis, bei jedem deklarierten Parameter entweder das Schlüsselwort ByVal oder ByRef anzugeben. Dies erleichtert das Lesen Ihres Codes.
Weitere Informationen
- Vorgehensweisen
- Parameter und Argumente von Prozeduren
- Vorgehensweise: Übergeben von Argumenten an eine Prozedur
- Übergeben von Argumenten als Wert und als Verweis
- Unterschiede zwischen veränderbaren und nicht veränderbaren Argumenten
- Unterschiede zwischen dem Übergeben von Argumenten als Wert und als Verweis
- Vorgehensweise: Ändern des Werts eines Prozedurarguments
- Vorgehensweise: Erzwingen, dass ein Argument als Wert übergeben wird
- Übergeben von Argumenten nach Position und Name
- Value Types and Reference Types