Gewusst wie: Erzwingen, dass ein Argument als Wert übergeben wird (Visual Basic)
Die Prozedurdeklaration bestimmt den Übergabemechanismus. Wenn ein Parameter als ByRef deklariert wird, erwartet Visual Basic, dass das entsprechende Argument durch Verweis übergeben wird. Dadurch kann die Prozedur den Wert des Programmierelements ändern, das dem Argument im aufrufenden Code zugrunde liegt. Wenn Sie das zugrunde liegende Element vor einer solchen Änderung schützen möchten, können Sie den ByRef
-Übergabemechanismus im Prozeduraufruf überschreiben, indem Sie den Argumentnamen in Klammern einschließen. Diese Klammern werden zusätzlich zu den Klammern verwendet, die die Argumentliste im Aufruf umschließen.
Der aufrufende Code kann einen ByVal-Mechanismus nicht überschreiben.
So erzwingen Sie, dass ein Argument durch einen Wert übergeben wird
Wenn der entsprechende Parameter in der Prozedur als
ByVal
deklariert ist, müssen Sie keine zusätzlichen Schritte ausführen. Visual Basic erwartet bereits, dass das Argument durch einen Wert übergeben wird.Wenn der entsprechende Parameter in der Prozedur als
ByRef
deklariert ist, schließen Sie das Argument im Prozeduraufruf in Klammern ein.
Beispiel
Im folgenden Beispiel wird eine ByRef
-Parameterdeklaration überschrieben. Beachten Sie in dem Aufruf, der ByVal
erzwingt, die beiden Ebenen von Klammern.
Sub setNewString(ByRef inString As String)
inString = "This is a new value for the inString argument."
MsgBox(inString)
End Sub
Dim str As String = "Cannot be replaced if passed ByVal"
' The following call passes str ByVal even though it is declared ByRef.
Call setNewString((str))
' The parentheses around str protect it from change.
MsgBox(str)
' The following call allows str to be passed ByRef as declared.
Call setNewString(str)
' Variable str is not protected from change.
MsgBox(str)
Wenn str
in der Argumentliste in zusätzliche Klammern eingeschlossen ist, kann die Prozedur setNewString
ihren Wert im aufrufenden Code nicht ändern, und MsgBox
zeigt „Kann bei Übergabe mit „ByVal“ nicht ersetzt werden.“ an. Wenn str
nicht in zusätzliche Klammern eingeschlossen ist, kann die Prozedur den Wert ändern, und MsgBox
zeigt „Dies ist ein neuer Wert für das inString-Argument.“ an.
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.
Stabile Programmierung
Wenn eine Prozedur einen ByRef-Parameter deklariert, hängt die korrekte Ausführung des Codes möglicherweise davon ab, dass das zugrunde liegende Element im aufrufenden Code geändert werden kann. Wenn der aufrufende Code diesen aufrufenden Mechanismus überschreibt, indem das Argument in Klammern eingeschlossen wird, oder wenn er ein nicht veränderliches Argument übergibt, kann die Prozedur das zugrunde liegende Element nicht ändern. Dies kann zu unerwarteten Ergebnissen im aufrufenden Code führen.
.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: Ändern des Werts eines Prozedurarguments
- Vorgehensweise: Schützen eines Prozedurarguments gegen Wertänderungen
- Übergeben von Argumenten nach Position und Name
- Value Types and Reference Types