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


Answers:


98

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


2
@Spolto:如果要将VBScript转换为VB,则应确保将“显式”和“严格”模式设置为on。它会为您提供更多错误消息,但是大多数错误将指向问题的根源(例如,声明为无类型的变量),而不是次要问题(例如,声明为无类型的变量变为Object,因此不能将其用于ByRef x As Integer参数)。
Guffa 2010年

4
@Guffa:我不知道这是否是版本,但是当传递未初始化的引用类型变量作为ByRef参数时,我也会收到编译器警告。(值类型参数不会发生这种情况。)
Dan Tao 2010年

4
@Dan Tao,Spolto:似乎有所不同,我也收到了引用类型的警告。无法指定参数是语言的局限性,您只需要初始化变量即可摆脱警告。即使分配Nothing给他们也可以摆脱警告,即使它不会改变结果。
Guffa 2010年

1
@Guffa:是的,Nothing到目前为止,我一直在分配给他们。这只是浪费时间,因为我必须在一个大型旧网站中进行数百次。感谢您的调查。
cspolton 2010年

3
@MarkHurd:然后,向下投票是不公正的,因为我已经介绍了该Out属性等同于C#out关键字。
Guffa

32

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

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

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


3
这很重要。我有一个MembershipProvider的VB子类,然后是VB子类的C#子类。在我将VB类中的属性应用于在MembershipProvider基类中指定的参数之前,C#代码没有认识到MembershipProvider中的抽象方法已经实现的事实。
理查德·科莱特

@RichardCollette可能值得回答我的链接问题!
马克·赫德2014年

9

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

在这里找到答案

更新资料

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


在一般情况下,我同意为ByRef是最接近的。但是,如果您按照问题的要求传递未初始化的变量,ByRef仍会发出警告。
理查德(Richard)

我的不赞成意见来自很久以前:您链接到的网站非常普通。它没有列出特定的问题,差异和技术性。而且您的答案仍然无法回答问题。
马克·赫德2012年

1

我在VB.NET中遇到了一个问题,即我调用了“由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

3
匈牙利表示法违反.NET框架设计准则。
Gqqnbig

0

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

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

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

只需使用ByRef。


3
这不能回答问题,对于C#是错误的。
cspolton 2012年

byref允许您不初始化,并允许您更改params值。但是,与C#out参数相反,它确实允许您使用值初始化参数并在函数中使用它,而在C#中,out关键字强制您仅将此参数用作输出参数,而不用作输入功能。另外,如果您未在函数中更改此参数或在其中设置此参数的值,则与C#会发出编译错误的情况相反,编译器也不会将其视为错误。
pashute


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.