是否有VB.NET等效的C#out参数?

时间:2010-12-05 12:21:37

标签: vb.net c#-to-vb.net out-parameters

VB.NET是否直接等效于C#out函数参数,其中传递给函数的变量不需要初始化?

7 个答案:

答案 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

Found the answer here

<强>更新

如评论中所述,请不要忘记初始化将在插槽中使用的参数

答案 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

相关问题