通过值和通过引用传递参数
更新:2007 年 11 月
在 Visual Basic 中,可以将实参通过值或通过引用传递给过程。这称为传递机制,它确定过程是否更改调用代码中作为实参基础的编程元素。过程声明通过指定 ByVal 或 ByRef 关键字确定每个形参的传递机制。
差异
将实参传递给过程时,请注意它们互相影响的几点差异:
基础编程元素可更改还是不可更改
实参本身可更改还是不可更改
实参通过值还是通过引用传递
实参数据类型是值类型还是引用类型
有关更多信息,请参见可更改和不可更改参数之间的差异和通过值传递参数和通过引用传递参数之间的差异。
选择传递机制
应该认真选择每个实参的传递机制。
保护。在两个传递机制之间选择时,最重要的标准是公开要更改的调用变量。传递实参 ByRef 的优点是过程可以通过该实参将值返回给调用代码。传递实参 ByVal 的优点是它可防止变量被过程更改。
性能。尽管传递机制能够影响代码的性能,但差异通常并不显著。这种情况的一个例外是被传递给 ByVal 的值类型。这种情况下,Visual Basic 会复制实参的整个数据内容。因此,对于像结构这样的大值类型,以 ByRef 传递机制传递实参的效率可能更高。
对于引用类型,仅复制指向数据的指针(32 位平台采用四个字节,64 位平台采用八个字节)。因此,可以通过值传递 String 或 Object 类型的实参而不会降低性能。
确定传递机制
过程声明指定每个形参的传递机制。调用代码不能重写 ByVal 机制,但如果形参是以 ByRef 声明的,则调用代码可通过在调用中将实参名用括号括起来,将传递机制强制为 ByVal。
Visual Basic 中的默认行为是通过值传递实参。使用 ByVal 关键字可使代码更易阅读。在声明每个形参时都使用关键字 ByVal 或 ByRef 是一种良好的编程习惯。
何时通过值传递实参
如果作为实参基础的调用代码元素是不可更改元素,则以 ByVal 声明对应的形参。任何代码都不能更改不可更改元素的值。
如果基础元素可更改,但您不想让过程更改它的值,则以 ByVal 声明形参。只有调用代码可以更改通过值传递的可更改元素的值。
何时通过引用传递实参
如果过程确实需要更改调用代码中的基础元素,则以 ByRef 声明对应的形参。
如果正确执行代码取决于更改调用代码中基础元素的过程,则以 ByRef 声明形参。如果通过值传递实参,或者如果调用代码通过将实参括在括号内重写 ByRef 传递机制,则过程调用可能产生意外结果。