如何:强制通过值传递参数

更新: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 中的默认行为是通过值传递实参。不过,在声明每个形参时都使用关键字 ByValByRef 是一种很好的编程习惯。这将增强代码的可读性。

可靠编程

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

安全性

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

请参见

任务

如何:将参数传递给过程

如何:更改过程参数的值

如何:防止过程参数的值被更改

概念

Visual Basic 中的过程

过程参数和变量

通过值和通过引用传递参数

可更改和不可更改参数之间的差异

通过值传递参数和通过引用传递参数之间的差异

通过位置和通过名称的参数传递

值类型和引用类型