VB.NET是否直接等效于C#out
函数参数,其中传递给函数的变量不需要初始化?
答案 0 :(得分:88)
不,VB中没有等效的out
关键字。
但是,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互操作或平台编组调用时产生影响调用。)
答案 1 :(得分:30)
不,没有等效的构造允许将非初始化变量传递给没有警告的方法,但正如question and answer中所述,在{{1}上指定<Out()>
attribute参数定义,虽然VB忽略它, 被C#视为ByRef
参数。
因此,我会将参考变量初始化为out
,指定Nothing
以表示意图(如果C#用户访问您的方法,则会有效)。 / p>
如果您想知道何时打算在其他未分配的参考变量中访问默认<Out()> ByRef
,您可以设置“警告配置”“在分配之前使用变量”到< strong>“无”在项目级别(项目属性&gt;编译,您可能希望在更改此设置之前将配置设置为“所有配置”),或者,在VS2015(VB.NET 14)中,您可以使用Nothing
。
答案 2 :(得分:7)
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
<强>更新强>
如评论中所述,请不要忘记初始化将在插槽中使用的参数
答案 3 :(得分:1)
我在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
答案 4 :(得分:0)
您可以在VB.NET中使用pass by reference方法。
您需要C#中的Out参数机制,因为它不允许您在不初始化的情况下使用任何变量。
VB.NET不需要特殊的关键字,因为它自动自动完成。
只需使用ByRef。
答案 5 :(得分:0)
VB的属性应与C#out相同,但即使您使用它,今天仍然会收到警告。有关于在github的vblang区域修复它的详细信息。 https://github.com/dotnet/vblang/issues/67
答案 6 :(得分:-5)
在变量之前使用关键字ByRef。