我刚刚安装了 Visual Studio 2010 Service Pack(在 Windows 更新上提出),我可以在“智能感知”上看到一个新功能,这意味着当我在 VB.NET 中编写 a Function
orSub
时,它不会使用ByRef
or自动完成参数ByVal
。 .
1)无论如何,我可以将此选项配置回以前的状态吗?
2)如果我不指定ByX
,默认使用哪一个?(似乎总是如此ByRef
)
我刚刚安装了 Visual Studio 2010 Service Pack(在 Windows 更新上提出),我可以在“智能感知”上看到一个新功能,这意味着当我在 VB.NET 中编写 a Function
orSub
时,它不会使用ByRef
or自动完成参数ByVal
。 .
1)无论如何,我可以将此选项配置回以前的状态吗?
2)如果我不指定ByX
,默认使用哪一个?(似乎总是如此ByRef
)
这篇文章似乎涵盖了您的问题:
所以不,没有办法得到旧的行为。从现在开始ByVal
是默认的(以前的),它不会自动添加到方法参数中。
在我看来,这是一个很好的决定,因为它使 VB.NET 与 C# 更加一致,并且避免了不必要的“噪音”(它已经足够冗长了)。
旧行为:
Private Sub test(ByVal test As String)
End Sub
新行为
Private Sub test(test As String)
End Sub
Tim 涵盖了您直接询问的内容,但要记住的其他一点是,任何引用类型变量,例如用户定义的类,即使按值传递,也将允许您更改保留的实例属性等。但是,它不允许您更改整个对象。这可能就是为什么在您看来默认通过引用
Public Sub (Something As WhateverClass)
Something = New WhateverClass 'will result in no changes when outside this method
Something.Property1 = "Test" 'will result in an updated property when outside this method
End Sub
来自MSDN:
引用类型的值是指向内存中其他地方的数据的指针。这意味着当您按值传递引用类型时,过程代码有一个指向底层元素数据的指针,即使它不能访问底层元素本身。例如,如果元素是数组变量,则过程代码本身无法访问变量,但可以访问数组成员。
将例程传输到 VBA 时要小心,默认值是ByRef
(例如,参见本页底部的“传递参数的默认方法” ,由伟大的 Chip Pearson 撰写)。那可能很混乱。