Is there a VB.NET equivalent of C# out parameters?

2019-01-09 00:34发布

Does VB.NET have a direct equivalent to C# out function parameters, where the variable passed into a function does not need to be initialised?

7条回答
兄弟一词,经得起流年.
2楼-- · 2019-01-09 00:36

You can use the pass by reference method in VB.NET.

You need the Out parameter mechanism in C#, because it doesn't let you use any variable without initializing it.

VB.NET doesn't need a special keyword as it automatically does it by itself.

Just use ByRef.

查看更多
相关推荐>>
3楼-- · 2019-01-09 00:40

No, there is no equivalent construct that allows a non-initialised variable to be passed to a method without a warning, but, as mentioned in my question and answer specifying an <Out()> attribute on a ByRef parameter definition, although VB ignores it, is treated by C# as an out parameter.

So, I would pre-initialise reference variables to Nothing and specify <Out()> ByRef to signify the intention (that will work if C# users ever access your methods).

If you feel you know when you intend to access the default Nothing in otherwise unassigned reference variables you can set the "Warning configuration" "Use of variable prior to assignment" to "None" at the Project level (Project Properties > Compile, and you probably want to set Configuration to "All Configurations" before changing this setting), or, in VS2015 (VB.NET 14), you can use #Disable Warning BC42030.

查看更多
何必那么认真
4楼-- · 2019-01-09 00:40

I had the problem in VB.NET that I called a function "by ref" that passed an array back.

Even though the compiler flagged it as a warning it was fine. The fix is super simple and probably good programming practice.

I changed

Dim m_arr_values() as Integer

fnRetArray(m_arr_values)

to

' Even though 'Nothing' is the default value, setting it
' stops the compiler complaining.
Dim m_arr_values() as Integer = Nothing

fnRetArray(m_arr_values)

It also helps when coding if variable names are descriptive...

Sub fnCreatePalette(ByRef arr_in_pal() As color, ByRef arr_out_pal() as uinteger)
    ...
End Sub
查看更多
贪生不怕死
5楼-- · 2019-01-09 00:51

Use keyword ByRef before variable.

查看更多
看我几分像从前
6楼-- · 2019-01-09 00:56

VB has the attribute which should be the same as C# out but today you still get a warning even if you use it. There are details about fixing it in vblang area of github. https://github.com/dotnet/vblang/issues/67.

查看更多
倾城 Initia
7楼-- · 2019-01-09 00:59

C# version

  void TestFunc(int x, ref int y, out int z) {
  x++;  
  y++;
  z = 5;
}

Vb.net version

    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

Update

As stated in the comment do not forget to initialze your parameter that will be used in the out slot

查看更多
登录 后发表回答