如何:防止过程参数的值被更改 (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)