如何:防止过程参数的值被更改 (Visual Basic)

如果过程声明参数, ByRef (Visual Basic)Visual Basic 为直接对基础调用代码中的编程元素的一个参数的程序代码。 这使得过程能够更改调用代码中作为实参基础的值。 有时调用代码可能需要防止此类更改。

可以通过声明对应的参数 ByVal (Visual Basic) 始终防止实参更改在过程中。 如果您希望能够更改特定参数在某些情况下,但没有其他中,可以声明它 ByRef ,让调用代码确定在每个的传递机制调用。 它通过将对应的实参将执行该值,或者括号内不括在括号中而通过引用。 有关更多信息,请参见 如何:强制通过值传递参数 (Visual Basic)

示例

下面的示例演示获取数组变量并对其元素的两个过程。 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是引用类型,replace可以更改其成员,因此,即使传递机制为 ByVal。

第二 MsgBox 调用显示 “after replace(n):11, 21, 31, 41 "。 由于n通过 ByVal,replace无法通过将新数组更改调用代码中的变量的n到它。 当replace创建新的数组实例k并将其赋给局部变量a时,它将丢失对n已通过调用代码。 当更改a的成员,因此,只有局部数组k受到影响。 因此,replace不会使数组n的值在调用代码中。

编译代码

在 Visual Basic 的默认值是通过值传递实参。 但是,好的编程习惯。声明每个 ByVal (Visual Basic) 形参或 ByRef (Visual Basic) 关键字。 这将使您的代码更容易阅读。

请参见

任务

如何:将参数传递给过程 (Visual Basic)

如何:更改过程参数的值 (Visual Basic)

如何:强制通过值传递参数 (Visual Basic)

概念

Visual Basic 中的过程

过程参数和变量 (Visual Basic)

通过值和通过引用传递参数 (Visual Basic)

可修改和不可修改参数之间的差异 (Visual Basic)

通过值传递参数和通过引用传递参数之间的差异 (Visual Basic)

按位置和名称传递参数 (Visual Basic)

值类型和引用类型