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

过程声明确定传递机制。 如果形参声明为 ByRef (Visual Basic),则 Visual Basic 将通过引用传递对应的实参。 这使得过程可以更改调用代码中的实参所代表的编程元素的值。 如果希望防止更改基础元素,可以将实参名称包括在括号中,以重写过程调用中的 ByRef 传递机制。 这些括号是除了包括调用实参列表的括号之外的括号。

调用代码无法重写 ByVal (Visual Basic) 机制。

强制通过值传递实参

  • 如果对应的形参在过程中声明为 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 (Visual Basic)ByRef (Visual Basic) 是一种很好的编程习惯。 这将增强代码的可读性。

可靠编程

如果过程声明了形参 ByRef (Visual Basic),此代码的正确执行可能依赖于能够更改调用代码中的基础元素。 如果调用代码通过将实参包括在括号中来重写此调用机制,或传递不可修改的实参,过程将无法更改基础元素。 这可能会在调用代码中产生意外的结果。

安全性

允许过程更改调用代码中实参所代表的值始终存在潜在的风险。 请确保您希望更改这个值,并在使用该值前首先检查其有效性。

请参见

任务

如何:将参数传递给过程 (Visual Basic)

如何:更改过程参数的值 (Visual Basic)

如何:防止过程参数的值被更改 (Visual Basic)

概念

Visual Basic 中的过程

过程参数和变量 (Visual Basic)

通过值和通过引用传递参数 (Visual Basic)

可修改和不可修改参数之间的差异 (Visual Basic)

通过值传递参数和通过引用传递参数之间的差异 (Visual Basic)

按位置和名称传递参数 (Visual Basic)

其他资源

数据类型实现 (Visual Basic)