Parameterübergabemechanismus für Visual Basic 6.0-Benutzer
Aktualisiert: November 2007
In Visual Basic 2008 wurden einige Änderungen eingeführt, die sich auf die Übergabe von Argumenten an Prozeduren auswirken.
Standardübergabemechanismus
Visual Basic 6.0
Wenn in Visual Basic 6.0 weder ByVal noch ByRef für einen Prozedurparameter angegeben wird, wird als Übergabemechanismus standardmäßig ByRef verwendet. Dadurch kann die Variable, die an die Prozedur übergeben wird, im aufrufenden Programm geändert werden.
Diese mögliche Änderung einer Variablen birgt jedoch Risiken. Im folgenden Beispiel wird als Standardübergabemechanismus ByRef verwendet, der Wert von elapsedSeconds wird durch minutesPastHour geändert, und elapsedSeconds wird von MsgBox falsch angezeigt:
Function minutesPastHour(seconds As Integer) As Integer
Dim hours As Integer = seconds \ 3600
seconds = seconds Mod 3600
Return seconds \ 60
End Function
Sub showSecondsAndMinutes()
Dim elapsedSeconds, extraMinutes As Integer
elapsedSeconds = CInt(Timer()) ' Integer seconds since midnight.
extraMinutes = minutesPastHour(elapsedSeconds)
MsgBox "Total seconds: " & elapsedSeconds & _
"; minutes past hour: " & extraMinutes
End Sub
Wird ein Argument mit ByRef übergeben, besteht die Möglichkeit, dass das Argument im aufrufenden Programm von einer Prozedur geändert wird. Dies kann zu einem unerwarteten Verhalten führen. Ruft diese Prozedur dann eine andere Prozedur auf und übergibt dasselbe Argument mit ByRef, steigt das Risiko, dass die ursprüngliche Variable unbeabsichtigterweise geändert wird.
Visual Basic 2008
Wenn Sie in Visual Basic 2008 eine Prozedur deklarieren, wird der Übergabemechanismus für jeden Parameter standardmäßig auf ByVal festgelegt. Dies verhindert die Änderung von Argumenten. Die Deklaration im vorangehenden Beispiel kann wie folgt umformuliert werden.
Function MinutesPastHour(ByVal Seconds As Integer) As Integer
Wenn seconds als Wert übergeben wird, kann die Prozedur nicht auf die Variable im aufrufenden Programm zugreifen. Dadurch lässt sich das oben beschriebene Problem umgehen.
Auch wenn ByVal der Standardmechanismus ist, beseitigen Sie Unsicherheiten und verbessern die Lesbarkeit Ihres Codes, indem Sie ihn explizit für jeden Parameter festlegen.
ByRef-Eigenschaftenargumente
Visual Basic 6.0
In Visual Basic 6.0 wird eine Eigenschaft, die als ByRef-Argument an eine Prozedur übergeben wird, zwar in die Prozedur hinein, nicht aber aus ihr heraus kopiert. Dies bedeutet, das Änderungen an einem solchen Eigenschaftenargument nicht an die ursprüngliche Eigenschaft im aufrufenden Programm zurückgegeben werden, auch nicht, wenn es mit ByRef übergeben wurde.
Visual Basic 2008
In Visual Basic 2008 wird ein mit ByRef übergebenes Eigenschaftenargument sowohl in die Prozedur als auch aus dieser kopiert. Im folgenden Beispiel wird veranschaulicht, wie eine Eigenschaft durch eine Prozedur geändert werden kann.
Sub Reduce(ByRef Height As Single)
' ... ... ... ... ... ... ... ' Code to modify Height argument.
End Sub
Dim Sq As Square = New Square ' Square has property Side of type Single.
Reduce(Sq.Side) ' Side is changed when Reduce returns.
Wenn ein Eigenschaftenargument von einer Prozedur geändert wird, wird der Wert der ursprünglichen Eigenschaft nicht sofort im aufrufenden Programm geändert. Stattdessen wird er herauskopiert, sobald die Steuerung an die Prozedur zurückgegeben wird.
ParamArray-Argumente
Visual Basic 6.0
In Visual Basic 6.0 kann eine Prozedur das Schlüsselwort ParamArray für die letzten Argumente festlegen, damit ein Array von Variant-Argumenten angenommen werden kann. Der Übergabemechanismus dieser Argumente kann nicht deklariert werden. Sie werden immer mit ByRef übergeben.
Visual Basic 2008
In Visual Basic 2008 werden ParamArray-Argumente immer als ByVal übergeben. Die im Array enthaltenen Argumente müssen denselben Datentyp haben wie das ParamArray-Argument.
Siehe auch
Konzepte
Prozedurdeklaration für Visual Basic 6.0-Benutzer
Abfolge von Prozeduraufrufen für Visual Basic 6.0-Benutzer
Änderungen an der Unterstützung von Programmierelementen (Zusammenfassung)