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?
No, there is no equivalent of the out
keyword in VB.
However, VB does automatically initialise all local variables in a method, so you can use ByRef
without needing to explicitly initialise the variable first.
Example:
Sub Main()
Dim y As Integer
Test(y)
End Sub
Sub Test(ByRef x As Integer)
x = 42
End Sub
(If you examine code in the framework (for example Double.TryParse), you may see the <OutAttribute>
added to parameters, but that only makes a difference when the call is marshalled for COM interop or platform invoke.)
<OutAttribute>
, fortunately I'm migrating a classic ASP app to VB.NET, it's not COM interop or platform invoke. I have hundreds of compiler warnings to deal with. –
Resolve Object
, so it can't be used for a ByRef x As Integer
parameter). –
Dare ByRef
parameters. (It doesn't happen with value type parameters.) –
Vicenary Nothing
to them will get rid of the warning eventhough it doesn't change the result. –
Dare Nothing
to them so far. It's just time consuming as I'm having to do it hundreds of times in a large legacy website. Thank you for investigating. –
Resolve <Out()>
attribute is equivalent to the C# version, as my answer points out. –
Larghetto Out
attribute is not equivalent to the C# out
keyword. –
Dare out
parameter and a VB.NET <Out()> ByRef
parameter. –
Larghetto 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
.
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
Update
As stated in the comment do not forget to initialze your parameter that will be used in the out slot
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
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.
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.
Use keyword ByRef before variable.
ByRef
is equivalent to ref
parameters in C#, which need to be initialised before being passing into a function. –
Resolve © 2022 - 2024 — McMap. All rights reserved.