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