如何:保护过程参数免受值更改 (Visual Basic)

如果过程将参数声明为 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传递给ByValreplace无法通过向变量n分配新数组来修改调用代码。 当replace创建新数组实例k并将其分配给局部变量a时,它将失去调用代码传入的n引用。 更改其成员 a时,仅影响本地数组 k 。 因此, replace 不会递增调用代码中数组 n 的值。

编译代码

Visual Basic 中的默认值是按值传递参数。 但是,最好是将 ByValByRef 关键字包含在每个声明的参数中。 这使代码更易于阅读。

另请参阅