如何:强制通过值传递参数
更新:2007 年 11 月
过程声明确定传递机制。如果形参声明为 ByRef,则 Visual Basic 将通过引用传递对应的实参。这使得过程可以更改调用代码中的实参所代表的编程元素的值。如果希望防止更改基础元素,可以将实参名称包括在括号中,以重写过程调用中的 ByRef 传递机制。这些括号是除了包括调用实参列表的括号之外的括号。
调用代码无法重写 ByVal 机制。
强制通过值传递实参
如果对应的形参在过程中声明为 ByVal,则无需执行其他步骤,Visual Basic 已经预期通过值传递实参。
如果对应形参在过程中声明为 ByRef,则在过程调用中将实参包括在括号中。
示例
下面的示例重写了一个 ByRef 形参声明。在强制 ByVal 的调用中,注意存在两级括号。
Sub setNewString(ByRef inString As String)
inString = "This is a new value for the inString argument."
MsgBox(inString)
End Sub
Dim str As String = "Cannot be replaced if passed ByVal"
' The following call passes str ByVal even though it is declared ByRef.
Call setNewString((str))
' The parentheses around str protect it from change.
MsgBox(str)
' The following call allows str to be passed ByRef as declared.
Call setNewString(str)
' Variable str is not protected from change.
MsgBox(str)
将 str 包括在实参列表中的额外括号中时,setNewString 过程无法更改它在调用代码中的值,且 MsgBox 显示“如果通过值传递则无法替换”。没有将 str 包括在额外括号中时,过程可以更改此值,且 MsgBox 显示“这是 inString 参数的一个新值”。
编译代码
当通过引用传递变量时,必须使用关键字 ByRef 来指定此机制。
Visual Basic 中的默认行为是通过值传递实参。不过,在声明每个形参时都使用关键字 ByVal 或 ByRef 是一种很好的编程习惯。这将增强代码的可读性。
可靠编程
如果过程声明了形参 ByRef,此代码的正确执行可能依赖于能够更改调用代码中的基础元素。如果调用代码通过将实参包括在括号中来重写此调用机制,或传递不可修改的实参,过程将无法更改基础元素。这可能会在调用代码中产生意外的结果。
安全性
允许过程更改调用代码中实参所代表的值始终存在潜在的风险。请确保您希望更改这个值,并在使用该值前首先检查其有效性。