Gewusst wie: Ändern des Werts eines Prozedurarguments (Visual Basic)
Wenn Sie eine Prozedur aufrufen, entspricht jedes von Ihnen angegebenen Argument einem der in der Prozedur definierten Parameter. In einigen Fällen kann der Prozedurcode den Wert ändern, der einem Argument im aufrufenden Code zugrunde liegt. In anderen Fällen kann die Prozedur nur die lokale Kopie eines Arguments ändern.
Wenn Sie die Prozedur aufrufen, erstellt Visual Basic eine lokale Kopie jedes Arguments, das byVal übergeben wird. Für jedes von ByRef übergebene Argument stellt Visual Basic dem Prozedurcode einen direkten Verweis auf das Programmierelement zur Verfügung, das dem Argument im aufrufenden Code zugrunde liegt.
Wenn das zugrunde liegende Element im aufrufenden Code ein änderbares Element ist und das Argument ByRef
übergeben wird, kann der Prozedurcode den direkten Verweis verwenden, um den Wert des Elements im aufrufenden Code zu ändern.
Ändern des zugrunde liegenden Werts
So ändern Sie den zugrunde liegenden Wert eines Prozedurarguments im aufrufenden Code
Geben Sie in der Prozedurdeklaration ByRef für den Parameter an, der dem Argument entspricht.
Übergeben Sie im aufrufenden Code ein änderbares Programmierelement als Argument.
Schließen Sie im aufrufenden Code das Argument nicht in Klammern in die Argumentliste ein.
Verwenden Sie im Prozedurcode den Parameternamen, um dem zugrunde liegenden Element im aufrufenden Code einen Wert zuzuweisen.
Eine Demonstration finden Sie im Beispiel weiter unten.
Ändern lokaler Kopien
Wenn das zugrunde liegende Element im aufrufenden Code ein nicht veränderliches Element ist oder das Argument ByVal
übergeben wird, kann die Prozedur ihren Wert im aufrufenden Code nicht ändern. Die Prozedur kann jedoch ihre lokale Kopie eines solchen Arguments ändern.
So ändern Sie die Kopie eines Prozedurarguments im Prozedurcode
Geben Sie in der Prozedurdeklaration ByRef für den Parameter an, der dem Argument entspricht.
Oder
Schließen Sie im aufrufenden Code das Argument in Klammern in die Argumentliste ein. Dadurch wird erzwungen, dass Visual Basic das Argument nach Wert übergibt, selbst wenn der entsprechende Parameter
ByRef
angibt.Verwenden Sie im Prozedurcode den Parameternamen, um der lokalen Kopie des Arguments einen Wert zuzuweisen. Der zugrunde liegende Wert im aufrufenden Code wird nicht geändert.
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.
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(ByRef 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 replace
seine Member ändern, obwohl der Übergabemechanismus ByVal
ist.
Der zweite MsgBox
-Aufruf zeigt „After replace(n): 101, 201, 301“ an. Da ByRef
an n
übergeben wird, kann replace
die Variable n
im aufrufenden Code ändern und ihr ein neues Array zuweisen. Weil n
ein Verweistyp ist, kann replace
auch seine Member ändern.
Sie können verhindern, dass die Prozedur die Variable selbst im aufrufenden Code ändert. Weitere Informationen finden Sie unter Vorgehensweise: Schützen eines Prozedurarguments vor Wertänderungen.
Kompilieren des Codes
Wenn Sie eine Variable als Verweis übergeben, müssen Sie das Schlüsselwort ByRef
verwenden, um diesen Mechanismus anzugeben.
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.
.NET Framework-Sicherheit
Es besteht immer ein potenzielles Risiko, wenn Sie einer Prozedur erlauben, den einem Argument zugrunde liegenden Wert im aufrufenden Code zu ändern. Stellen Sie sicher, dass Sie mit einer Änderung dieses Werts rechnen und darauf vorbereitet sind, ihn auf seine Gültigkeit zu überprüfen, bevor Sie ihn verwenden.
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: Schützen eines Prozedurarguments gegen Wertänderungen
- Vorgehensweise: Erzwingen, dass ein Argument als Wert übergeben wird
- Übergeben von Argumenten nach Position und Name
- Value Types and Reference Types