VB.NET 是否直接等效于 C#out
函数参数,其中传递给函数的变量不需要初始化?
7 回答
out
不,在 VB中没有等效的关键字。
但是,VB 会自动初始化方法中的所有局部变量,因此您ByRef
无需先显式初始化变量即可使用。
例子:
Sub Main()
Dim y As Integer
Test(y)
End Sub
Sub Test(ByRef x As Integer)
x = 42
End Sub
(如果您检查框架中的代码(例如Double.TryParse),您可能会看到<OutAttribute>
添加到参数,但这仅在为 COM 互操作或平台调用编组调用时才会有所不同。)
不,没有等效的构造允许将未初始化的变量传递给方法而不发出警告,但是,正如我的问答中提到的,在参数定义上指定<Out()>
属性ByRef
,尽管 VB 忽略它,但由C# 处理作为out
参数。
因此,我将预初始化引用变量Nothing
并指定<Out()> ByRef
以表示意图(如果 C# 用户曾经访问您的方法,这将起作用)。
如果您觉得您知道何时打算访问未分配的参考变量中的默认值,您Nothing
可以在项目级别(项目属性>编译,您可能想要在更改此设置之前将配置设置为“所有配置”),或者,在 VS2015(VB.NET 14)中,您可以使用.#Disable Warning BC42030
C#版本
void TestFunc(int x, ref int y, out int z) {
x++;
y++;
z = 5;
}
vb.net版
Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)
x += 1
y += 1
z = 5
End Sub
更新
如评论中所述,不要忘记初始化将在输出槽中使用的参数
我在 VB.NET 中遇到了一个问题,即我调用了一个“by ref”函数,该函数将一个数组传回。
即使编译器将其标记为警告,它也很好。修复非常简单,可能是很好的编程习惯。
我变了
Dim m_arr_values() as Integer
fnRetArray(m_arr_values)
到
' Even though 'Nothing' is the default value, setting it
' stops the compiler complaining.
Dim m_arr_values() as Integer = Nothing
fnRetArray(m_arr_values)
如果变量名称是描述性的,它在编码时也有帮助......
Sub fnCreatePalette(ByRef arr_in_pal() As color, ByRef arr_out_pal() as uinteger)
...
End Sub
您可以在 VB.NET 中使用按引用传递方法。
您需要 C# 中的 Out 参数机制,因为它不允许您在未初始化的情况下使用任何变量。
VB.NET 不需要特殊关键字,因为它会自动完成。
只需使用 ByRef。
VB 具有应该与 C# 相同的属性,但今天即使您使用它仍然会收到警告。在 github 的 vblang 区域中有关于修复它的详细信息。https://github.com/dotnet/vblang/issues/67。
在变量之前使用关键字ByRef 。