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

过程声明确定传递机制。 如果参数声明为 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 中的默认值是按值传递参数。 但是,最好是将 ByValByRef 关键字包含在每个声明的参数中。 这使代码更易于阅读。

可靠的编程

如果过程声明参数 ByRef,则代码的正确执行可能取决于能够在调用代码中更改基础元素。 如果调用代码通过将参数括在括号中来替代此调用机制,或者如果调用代码传递不可修改的参数,则过程无法更改基础元素。 这可能会在调用代码中产生意外结果。

.NET Framework 安全性

在允许过程更改调用代码中自变量的值时,始终存在潜在风险。 请确保预期此值会更改,并准备好在使用它之前检查该值的有效性。

另请参阅