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

csp*_*ton 87 vb.net out-parameters c#-to-vb.net

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

Guf*_*ffa 93

不,outVB中没有等效的关键字.

但是,VB会自动初始化方法中的所有局部变量,因此您ByRef无需先显式初始化变量即可使用.

例:

Sub Main()
  Dim y As Integer
  Test(y)
End Sub

Sub Test(ByRef x As Integer)
  x = 42
End Sub
Run Code Online (Sandbox Code Playgroud)

(如果检查框架中的代码(例如Double.TryParse),您可能会看到<OutAttribute>添加到参数,但这只会在为COM互操作或平台调用编组调用时产生影响.)

  • @Guffa:我不知道它是否是版本的东西,但是当将未初始化的*引用类型*变量作为`ByRef`参数传递时,我也得到编译器警告.(值类型参数不会发生.) (4认同)
  • @Dan Tao,Spolto:这似乎有所不同,我也会收到引用类型的警告.无法指定参数是语言的限制,您只需要初始化变量以消除警告.即使为它们分配"Nothing"也会消除警告,尽管它不会改变结果. (4认同)
  • @MarkHurd:那么downvote是不公正的,因为我已经说过`Out`属性*不等于C#`out`关键字. (3认同)
  • @Spolto:如果要将VBScript转换为VB,则应确保将“显式”和“严格”模式设置为on。它会为您提供更多错误消息,但是大多数错误都将指出问题的根源(例如,声明为无类型的变量),而不是次要问题(例如,声明为无类型的变量会变成“对象”,因此不能用于“ ByRef” x作为Integer`参数)。 (2认同)
  • @Guffa:是的,到目前为止,我一直在为他们分配“Nothing”。这只是耗时,因为我必须在大型遗留网站中执行数百次。感谢您的调查。 (2认同)

Mar*_*urd 30

没有,没有相当的结构,它允许非初始化变量传递到方法,无需警告,但是,正如我所提到的问题和回答指定<Out()>属性上的ByRef参数定义,虽然VB忽略它,用C#处理作为out参数.

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

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

  • 这很重要.我有一个MembershipProvider的VB子类,然后是VB子类的C#子类.C#代码没有意识到MembershipProvider中的抽象方法已经实现,直到我在VB类中为在MembershipProvider基类中指定为out的参数应用该属性. (3认同)

Dav*_*vid 7

C#版本

  void TestFunc(int x, ref int y, out int z) {
  x++;  
  y++;
  z = 5;
}
Run Code Online (Sandbox Code Playgroud)

Vb.net版本

    Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)
  x += 1
  y += 1 
  z = 5 
End Sub
Run Code Online (Sandbox Code Playgroud)

在这里找到答案

更新

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