如果过程将参数声明为 ByRef,则 Visual Basic 会为过程代码提供对调用代码中自变量基础的编程元素的直接引用。 这样,该过程便可以更改调用代码中自变量的基础值。 在某些情况下,调用代码可能想要防范此类更改。
始终可以通过在过程中声明相应的参数 ByVal 来保护参数免受更改。 如果要在某些情况下更改给定参数,但不能更改其他参数,可以声明该 ByRef
参数,并允许调用代码确定每个调用中的传递机制。 它通过将相应的参数括在括号中实现按值传递,或者不将其括在括号中实现按引用传递来实现此操作。 有关详细信息,请参阅 “如何:强制参数由值传递”。
示例:
下面的示例展示了两个过程,这两个过程接收数组变量并对其元素进行操作。
increase
过程只向每个元素添加一个数组变量。 该过程 replace
向参数 a()
分配一个新数组,然后将一个数组添加到每个元素。 但是,重新分配不会影响调用代码中的基础数组变量。
Public Sub increase(ByVal a() As Long)
For j As Integer = 0 To UBound(a)
a(j) = a(j) + 1
Next j
End Sub
Public Sub replace(ByVal a() As Long)
Dim k() As Long = {100, 200, 300}
a = k
For j As Integer = 0 To UBound(a)
a(j) = a(j) + 1
Next j
End Sub
Dim n() As Long = {10, 20, 30, 40}
Call increase(n)
MsgBox("After increase(n): " & CStr(n(0)) & ", " &
CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
Call replace(n)
MsgBox("After replace(n): " & CStr(n(0)) & ", " &
CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
第一个 MsgBox
调用显示“After increase(n): 11, 21, 31, 41”。 由于数组n
是引用类型,因此即使传递机制为increase
,也可以更改其ByVal
的成员。
第二个 MsgBox
调用显示“After replace(n): 11, 21, 31, 41”。 由于n
传递给ByVal
,replace
无法通过向变量n
分配新数组来修改调用代码。 当replace
创建新数组实例k
并将其分配给局部变量a
时,它将失去调用代码传入的n
引用。 更改其成员 a
时,仅影响本地数组 k
。 因此, replace
不会递增调用代码中数组 n
的值。
编译代码
Visual Basic 中的默认值是按值传递参数。 但是,最好是将 ByVal 或 ByRef 关键字包含在每个声明的参数中。 这使代码更易于阅读。