参数传入机制(针对 Visual Basic 6.0 用户)
更新:2007 年 11 月
Visual Basic 2008 中引入的一些更改会影响参数向过程的传递方式。
默认传递机制
Visual Basic 6.0
在 Visual Basic 6.0 中,如果没有为过程参数指定 ByVal 或 ByRef,则传递机制默认为 ByRef。这就允许在调用程序中修改已传递到过程中的变量。
公开变量进行修改会导致程序出现缺陷。在下面的示例中,传递机制默认为 ByRef,elapsedSeconds 的值由 minutesPastHour 更改,并且 MsgBox 不能正确显示 elapsedSeconds。
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
传递参数 ByRef 时,允许过程在调用程序中进行更改,这可导致意外行为。而且,如果该过程调用另一个过程,并传递同一个参数 ByRef,则会增加无意中更改原始变量的可能性。
Visual Basic 2008
在 Visual Basic 2008 中声明过程时,每个参数的传递机制都默认为 ByVal。这可防止修改参数。上例中的声明可按如下方式重写。
Function MinutesPastHour(ByVal Seconds As Integer) As Integer
通过值传递 seconds 可防止过程访问调用程序中的变量,因此有助于避免出现上述缺陷。
尽管 ByVal 是默认机制,但为每个参数显式指定该机制可消除不确定性,并使代码更易于阅读。
ByRef 属性参数
Visual Basic 6.0
在 Visual Basic 6.0 中,作为 ByRef 参数传递到过程中的属性复制到该过程中,但不是该过程外。这意味着,对此类属性参数的任何修改不会反映到调用程序的原始属性中,即使该属性参数是已传递的 ByRef。
Visual Basic 2008
在 Visual Basic 2008 中,通过 ByRef 机制传递的属性参数同时复制到过程内和过程外。下面的示例说明如何通过过程更改属性。
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.
当过程修改属性参数时,原始属性的值不会立即在调用程序中更改。而是在过程返回时复制到该过程外。
ParamArray 参数
Visual Basic 6.0
在 Visual Basic 6.0 中,过程可以在最后一个参数中指定 ParamArray 关键字,以便接受 Variant 参数的数组。不能声明这些参数的传递机制。这些传递机制始终是已传递的 ByRef。
Visual Basic 2008
在 Visual Basic 2008 中,ParamArray 参数始终通过 ByVal 机制传递。数组中的参数必须全是 ParamArray 参数的数据类型。
请参见
概念
过程调用序列(针对 Visual Basic 6.0 用户)