Gewusst wie: Schützen eines Prozedurarguments gegen Wertänderungen
Aktualisiert: November 2007
Wenn eine Prozedur einen Parameter als ByRef deklariert, übergibt Visual Basic einen direkten Verweis auf das Programmierelement, das dem Argument im Aufrufcode zugrunde liegt, an denProzedurcode. Damit kann die Prozedur den Wert ändern, der dem Argument im Aufrufcode zugrunde liegt. In bestimmten Fällen sollte der Aufrufcode eine solche Änderung verhindern.
Sie können ein Argument stets vor einer Änderung schützen, indem Sie den entsprechenden Parameter in der Prozedur als ByVal deklarieren. Wenn Sie ein Argument nur in bestimmten Fällen ändern können möchten, deklarieren Sie es als ByRef, und lassen Sie den Übergabemechanismus in jedem Aufruf vom Aufrufcode festlegen. Dabei wird das entsprechende Argument in runde Klammern eingeschlossen, um es als Wert zu übergeben, bzw. es wird nicht in Klammern eingeschlossen, um es als Verweis zu übergeben. Weitere Informationen finden Sie unter Gewusst wie: Erzwingen, dass ein Argument als Wert übergeben wird.
Beispiel
Im folgenden Beispiel werden zwei Prozeduren gezeigt, die eine Arrayvariable übernehmen und auf deren Elemente anwenden. Mit der increase-Prozedur wird einfach 1 zu jedem Element addiert. Mit der replace-Prozedur wird dem Parameter a() ein neues Array zugewiesen und zu jedem Element 1 addiert. Die Neuzuweisung wirkt sich jedoch nicht auf die zugrunde liegende Arrayvariable im Aufrufcode 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)))
Beim ersten MsgBox-Aufruf wird Folgendes angezeigt: "After increase(n): 11, 21, 31, 41". Da das Array n ein Verweistyp ist, kann replace dessen Member ändern, obwohl der Übergabemechanismus ByVal ist.
Beim zweiten MsgBox-Aufruf wird Folgendes angezeigt: "After replace(n): 11, 21, 31, 41". Da n mit ByVal übergeben wird, kann replace die Variable n im Aufrufcode durch Zuweisen eines neuen Arrays nicht ändern. Wenn replace die neue Arrayinstanz k erstellt und diese der lokalen Variablen a zuweist, geht der im Aufrufcode übergebene Verweis auf n verloren. Wenn die Member von a geändert werden, wirkt sich dies nur auf das lokale Array k aus. Deshalb inkrementiert replace die Werte von Array n im Aufrufcode nicht.
Kompilieren des Codes
Standardmäßig werden Argumente in Visual Basic als Wert übergeben. Beim Programmieren empfiehlt es sich jedoch, das ByVal-Schlüsselwort oder das ByRef-Schlüsselwort in jeden deklarierten Parameter aufzunehmen. Dadurch wird der Code besser lesbar.
Siehe auch
Aufgaben
Gewusst wie: Übergeben von Argumenten an eine Prozedur
Gewusst wie: Ändern des Werts eines Prozedurarguments
Gewusst wie: Erzwingen, dass ein Argument als Wert übergeben wird
Konzepte
Parameter und Argumente von Prozeduren
Ü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