参数传入机制(针对 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 用户)

过程调用序列(针对 Visual Basic 6.0 用户)

参数数组

编程元素支持更改总结

参考

Function 语句 (Visual Basic)

Sub 语句 (Visual Basic)

ByVal

ByRef

ParamArray