Freigeben über


Vorgehensweise: Schützen eines Prozedurarguments vor Wertänderungen (Visual Basic)

Wenn eine Prozedur einen Parameter als ByRef deklariert, 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 So erzwingen Sie, dass ein Argument als Wert übergeben wird.

Beispiel

Das folgende Beispiel zeigt zwei Prozeduren, die eine Arrayvariable verwenden und mit den zugehörigen Elementen arbeiten. Die increase Prozedur fügt jedem Element einfach ein Element hinzu. Die replace Prozedur weist dem Parameter a() ein neues Array zu und fügt dann jedem Element ein Array 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. Da es sich bei dem Array n um einen Verweistyp handelt, kann increase seine Member ändern, auch wenn der Übergabemechanismus ByVal ist.

Der zweite MsgBox-Aufruf zeigt „After replace(n): 11, 21, 31, 41“ an. Da n übergeben ByValwird, replace kann die Variable n im aufrufenden Code nicht geändert werden, indem sie ihm ein neues Array zuweist. Wenn replace die neue Arrayinstanz k erstellt und der lokalen Variablen a zugewiesen wird, verliert es den Verweis auf n, der vom aufrufenden Code übergeben wurde. Wenn die Mitglieder von a geändert werden, wird 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 empfiehlt sich jedoch, entweder das ByVal - oder ByRef-Schlüsselwort mit jedem deklarierten Parameter einzuschließen. Dadurch wird das Lesen des Codes vereinfacht.

Siehe auch