过程声明确定传递机制。 如果参数声明为 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
将显示“如果传递 ByVal,则无法替换”。 如果 str
没有被额外的括号括住,该过程可以更改它,并且 MsgBox
将显示“这是 inString 参数的新值”。
编译代码
通过引用传递变量时,必须使用 ByRef
关键字来指定此机制。
Visual Basic 中的默认值是按值传递参数。 但是,最好是将 ByVal 或 ByRef 关键字包含在每个声明的参数中。 这使代码更易于阅读。
可靠的编程
如果过程声明参数 ByRef,则代码的正确执行可能取决于能够在调用代码中更改基础元素。 如果调用代码通过将参数括在括号中来替代此调用机制,或者如果调用代码传递不可修改的参数,则过程无法更改基础元素。 这可能会在调用代码中产生意外结果。
.NET Framework 安全性
在允许过程更改调用代码中自变量的值时,始终存在潜在风险。 请确保预期此值会更改,并准备好在使用它之前检查该值的有效性。