假设我有以下功能:
Function myFunction(j As Integer) As Double
myFunction = 3.87 * j
Exit Function
End Function
j
作为值ByVal
或参考ByRef
传递了吗?
或者它取决于数据类型?如果我将一个复杂的对象作为值传递怎么办?
提前致谢!
答案 0 :(得分:8)
除非明确指定,否则传递参数ByVal
。有关详细信息,请参阅Passing Arguments by Value and by Reference,其中说明:
Visual Basic中的默认值是按值传递参数。您可以使用ByVal关键字使代码更易于阅读。在每个声明的参数中包含ByVal或ByRef关键字是一种很好的编程习惯。
至于:
如果我将复杂对象作为值传递怎么办?
这没关系,只要“复杂对象”是一个类(引用类型),你就不会进行大量的复制。这是因为对象实例的引用是通过值(ByVal)传递的,这意味着您只复制一个引用,即使该类非常大。
但是,如果复杂对象是结构(值类型),则在调用方法时将导致复制对象。这是顺便说一下,为什么像XNA这样的一些框架提供了许多方法的替代版本(如Matrix.Multiply),它们可以选择传递ByRef
- 这可以避免昂贵的Matrix结构副本。
答案 1 :(得分:1)
j
已通过ByVal
。除非明确说明ByVal
,否则始终会传递参数ByRef
。来自VB.NET 10 Specification的第9.2.5节:
未指定ByRef或ByVal的参数默认为ByVal。