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

Parameterarrays

Änderungen an der Unterstützung von Programmierelementen (Zusammenfassung)

Referenz

Function-Anweisung (Visual Basic)

Sub-Anweisung (Visual Basic)

ByVal

ByRef

ParamArray