如何:强制通过值传递参数 (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 安全性

允许过程更改调用代码中参数的基础值始终存在潜在风险。 请确保希望更改此值,并准备好在使用之前检查其有效性。

另请参阅