Freigeben über


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

Prozeduren in Visual Basic

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

Argumentübergabe nach Position und Namen

Wert- und Verweistypen