Parameter Passing Mechanism for Visual Basic 6.0 Users
Visual Basic 2008 introduces several changes affecting how arguments are passed to procedures.
Default Passing Mechanism
Visual Basic 6.0
In Visual Basic 6.0, if you do not specify ByVal or ByRef for a procedure parameter, the passing mechanism defaults to ByRef. This allows the variable passed into the procedure to be modified in the calling program.
Exposing a variable to modification can lead to a pitfall. In the following example, the passing mechanism defaults to ByRef, the value of elapsedSeconds gets altered by minutesPastHour, and elapsedSeconds is displayed incorrectly by MsgBox.
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
Passing an argument ByRef allows a procedure to change it in the calling program, which can lead to unexpected behavior. And if that procedure calls another procedure and passes the same argument ByRef, the chances of unintentionally changing the original variable are increased.
Visual Basic 2008
When you declare a procedure in Visual Basic 2008, the passing mechanism defaults to ByVal for every parameter. This protects arguments against modification. The declaration in the preceding example can be rewritten as follows.
Function MinutesPastHour(ByVal Seconds AsInteger) AsInteger
Passing seconds by value prevents the procedure from accessing the variable in the calling program, and helps avoid the pitfall just described.
Although ByVal is the default mechanism, specifying it explicitly for every parameter removes uncertainty and makes your code easier to read.
ByRef Property Arguments
Visual Basic 6.0
In Visual Basic 6.0, a property passed to a procedure as a ByRef argument is copied into the procedure but not copied out. This means that any modification to such a property argument is not reflected back to the original property in the calling program, even though it was passed ByRef.
Visual Basic 2008
In Visual Basic 2008, a property argument passed ByRef is copied both into and out of the procedure. The following example demonstrates how a property can be changed by a procedure.
Sub Reduce(ByRef Height AsSingle)
' ... ... ... ... ... ... ... ' Code to modify Height argument. EndSub
Dim Sq As Square = New Square ' Square has property Side of type Single.
Reduce(Sq.Side) ' Side is changed when Reduce returns.
When a procedure modifies a property argument, the value of the original property is not changed immediately in the calling program. Instead, it is copied out when the procedure returns.
ParamArray Arguments
Visual Basic 6.0
In Visual Basic 6.0, a procedure can specify the ParamArray keyword on the last of its arguments to accept an array of Variant arguments. You cannot declare the passing mechanism of these arguments. They are always passed ByRef.
Visual Basic 2008
In Visual Basic 2008, ParamArray arguments are always passed ByVal. The arguments in the array must all be of the data type of the ParamArray argument.
See Also
Concepts
Procedure Declaration for Visual Basic 6.0 Users
Procedure Calling Sequence for Visual Basic 6.0 Users
Programming Element Support Changes Summary