103

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

4

7 回答 7

106

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 互操作或平台调用编组调用时才会有所不同。)

于 2010-12-05T12:28:39.567 回答
35

不,没有等效的构造允许将未初始化的变量传递给方法而不发出警告,但是,正如我的问答中提到的,在参数定义上指定<Out()>属性ByRef,尽管 VB 忽略它,但C# 处理作为out参数。

因此,我将预初始化引用变量Nothing 指定<Out()> ByRef以表示意图(如果 C# 用户曾经访问您的方法,这将起作用)。

如果您觉得您知道何时打算访问未分配的参考变量中的默认值,Nothing可以项目级别(项目属性>编译,您可能想要在更改此设置之前将配置设置为“所有配置”),或者,在 VS2015(VB.NET 14)中,您可以使用.#Disable Warning BC42030

于 2011-08-13T13:59:15.903 回答
11

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

在这里找到了答案

更新

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

于 2010-12-05T12:26:32.513 回答
2

我在 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
于 2017-03-25T12:25:23.843 回答
1

您可以在 VB.NET 中使用按引用传递方法。

您需要 C# 中的 Out 参数机制,因为它不允许您在未初始化的情况下使用任何变量。

VB.NET 不需要特殊关键字,因为它会自动完成。

只需使用 ByRef。

于 2012-09-04T10:09:17.770 回答
1

VB 具有应该与 C# 相同的属性,但今天即使您使用它仍然会收到警告。在 github 的 vblang 区域中有关于修复它的详细信息。https://github.com/dotnet/vblang/issues/67

于 2018-01-14T05:59:01.603 回答
-4

在变量之前使用关键字ByRef 。

于 2010-12-05T12:23:40.230 回答