5

假设我有以下功能:

Function myFunction(j As Integer) As Double
    myFunction = 3.87 * j
    Exit Function
End Function

j作为值传递ByVal还是通过引用传递ByRef

还是取决于数据类型?如果我有一个复杂的对象作为值传递怎么办?

提前致谢!

4

2 回答 2

10

ByVal除非明确指定,否则传递参数。有关详细信息,请参阅按值和按引用传递参数,其中指出:

Visual Basic 中的默认设置是按值传递参数。您可以使用 ByVal 关键字使您的代码更易于阅读。在每个声明的参数中包含 ByVal 或 ByRef 关键字是一种很好的编程习惯。

至于:

如果我有一个复杂的对象作为值传递怎么办?

这很好,只要“复杂对象”是一个类(引用类型),您就不会进行大量复制。这是因为对对象实例的引用是按值 (ByVal) 传递的,这意味着您只复制一个引用,即使该类非常大。

但是,如果复杂对象是一个结构(值类型),您将导致在调用方法时复制该对象。顺便说一句,这就是为什么像 XNA 这样的一些框架提供了许多方法的替代版本(比如Matrix.Multiply),这些方法可以选择通过ByRef- 这避免了昂贵的 Matrix 结构副本。

于 2012-05-22T19:49:03.340 回答
1

j在这种情况下是通过的ByValByVal除非ByRef明确说明,否则始终传递参数。从VB.NET 10 规范的第 9.2.5 节:

未指定 ByRef 或 ByVal 的参数默认为 ByVal。

于 2012-05-22T19:52:07.990 回答