Gewusst wie: Erzwingen, dass ein Argument als Wert übergeben wird
Aktualisiert: November 2007
Der Übergabemechanismus richtet sich nach der Prozedurdeklaration. Wenn ein Parameter als ByRef deklariert wird, geht Visual Basic davon aus, dass das entsprechende Argument als Verweis zu übergeben ist. Auf diese Weise kann die Prozedur den Wert des Programmierelements ändern, der dem Argument im Aufrufcode zugrunde liegt. Wenn Sie das zugrunde liegende Element gegen eine solche Änderung schützen möchten, können Sie den ByRef-Übergabemechanismus im Prozeduraufruf überschreiben, indem Sie den Argumentnamen in Klammern einschließen. Diese Klammern kommen zu den Klammern hinzu, von denen die Argumentliste im Aufruf eingeschlossen ist.
Der Aufrufcode kann einen ByVal-Mechanismus nicht überschreiben.
So erzwingen Sie die Übergabe eines Arguments als Wert
Wenn der entsprechende Parameter in der Prozedur als ByVal deklariert wird, müssen Sie keine zusätzlichen Schritte ausführen. Visual Basic geht bereits davon aus, dass das Argument als Wert übergeben wird.
Wenn der entsprechende Parameter in der Prozedur als ByRef deklariert wird, schließen Sie das Argument im Prozeduraufruf in Klammern ein.
Beispiel
Im folgenden Beispiel wird eine ByRef-Parameterdeklaration überschrieben. Beachten Sie im Aufruf, mit dem ByVal erzwungen wird, die beiden Klammerebenen.
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ätzlichen Klammern eingeschlossen ist, kann die setNewString-Prozedur diesen Wert im Aufrufcode nicht ändern, und im MsgBox wird "Cannot be replaced if passed ByVal" angezeigt. Wenn str nicht von zusätzlichen Klammern eingeschlossen ist, kann die Prozedur den Wert ändern. MsgBox zeigt daraufhin "This is a new value for the inString argument." an.
Kompilieren des Codes
Die Variablenübergabe durch Verweis muss mit dem ByRef-Schlüsselwort angegeben werden.
Standardmäßig werden Argumente in Visual Basic als Wert übergeben. Beim Programmieren empfiehlt es sich jedoch, das ByVal-Schlüsselwort oder das ByRef-Schlüsselwort in jeden deklarierten Parameter aufzunehmen. Dadurch wird der Code besser lesbar.
Robuste Programmierung
Wenn eine Prozedur eine ByRef-Parameterdeklaration verwendet, kann die richtige Ausführung des Codes davon abhängen, ob das zugrunde liegende Element im Aufrufcode geändert werden kann. Wenn der Aufrufcode diesen Aufrufmechanismus überschreibt, indem das Argument in Klammern eingeschlossen wird, oder wenn der Code ein unveränderliches Argument übergibt, kann die Prozedur das zugrunde liegende Element nicht ändern. Dies kann im Aufrufcode unerwartete Ergebnisse zur Folge haben.
Sicherheit
Wenn Sie den Wert, der einem Argument im Aufrufcode zugrunde liegt, von einer Prozedur ändern lassen, stellt dies stets ein gewisses Risiko dar. Stellen Sie sicher, dass Sie mit der Änderung des Werts einverstanden sind, und überprüfen Sie die Gültigkeit des Werts, bevor Sie ihn verwenden.
Siehe auch
Aufgaben
Gewusst wie: Übergeben von Argumenten an eine Prozedur
Gewusst wie: Ändern des Werts eines Prozedurarguments
Gewusst wie: Schützen eines Prozedurarguments gegen Wertänderungen
Konzepte
Parameter und Argumente von Prozeduren
Ü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