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 ByValwird, 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 azugewiesen wird, verliert sie den Verweis, n der vom aufrufenden Code übergeben werden soll. Wenn die Member geändert awerden, 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