VB.NET supports parameter-passing styles to class member methods: ByVal, ByRef. All data types in VB.NET are passed by reference, but their default behavior is handled differently depending upon whether they are a value or reference type. You do not have to explicitly define it in your method. In fact, defining it explicitly causes a compile error. The ByVal parameter style indicates that the value type parameter being passed is not being altered upon returning from the method. Thus, the value of passed parameters of a value type, by default, cannot be changed.
For integral types and immutable classes such as strings, the VB.NET ByVal parameter type is similar to the C++ const type&. The ByVal type has no effect on mutable classes classes whose contents can be changed. The default behavior of references to mutable objects is handled as if the object was preceded with the ref keyword. In other words, with the ByVal keyword, you can pass the value's address to the method, but the value itself cannot be changed. To make the value changeable, use the VB.NET parameter type ByRef.
The VB.NET ByRef parameter type works like the type& standard reference in C++. A reference parameter does not create a new storage location. Instead, it represents the same storage location as the variable given as the argument in the function member invocation. Thus, the value of a reference parameter is always the same as the underlying variable.
A variable must be assigned before it can be passed as a reference parameter in a function member invocation. Within a function member, a reference parameter is considered initially assigned. Within an instance method or instance accessor of a structure type, the this keyword behaves exactly as a reference parameter of the structure type.
The out parameter is for explicitly referencing a parameter that will be filled by the called method. It has no complement in C++, but in COM+ the distinction was made in order to fulfill thorough marshalling back from a method. An out parameter differs from the ref parameter in that the caller doesn't need to initialize the variable prior to calling the method. Instead, a reference to the object can be sent uninitialized and initialized by the called method and then returned after instantiation. As with the ref parameter, an output parameter does not create a new storage location. Instead, it represents the same storage location as the variable given as the argument in the function member invocation. Thus, the value of an output parameter is always contained in the underlying variable that was passed into the method. Note that although an output parameter need not be assigned a value when it is passed into a method, it must be assigned a value when it returns from a method, otherwise the compiler will give an error.
Because structures are value types, when an instance of one is passed to a method, a copy is created of the structure. You can use the out keyword with a structure parameter to prevent the creation of large temporary storage space of a structure on the stack. VB.NET syntax encourages the return only of values or objects you really need and discourages the storage of temporary objects. This seems a sensible alternative to the C++ approach. In addition, the parameter distinction simplifies component programming for the developer.
I provides an example of how to use the ByBal, ByRef and out parameter modifiers.
Parameter Modifiers Example 1
// example method parameter usage; ByVal, ByRef
Imports System
Public Class ThirdFourthPower
Public Sub XPower(ByVal intparam1 As Int32, ByRef intparam2 As Int32, ByVal intparam3 As Int32, ByVal intparam4 As Int32)
intparam3 = intparam1 * intparam1 * intparam1
intparam2 = intparam1 * intparam1 * intparam1 * intparam1
' ERROR: you cannot use out parameters as a value, right value here
' intparam2 = intparam3 * intparam1;
intparam4 = intparam1 + intparam2 / intparam1
' notice operator
' precedence
End Sub
End Class
Class MathyApp
Public Shared Sub Main()
Dim app1 As New ThirdFourthPower()
Dim nTriple1 As Int32
' out parameters need not be initialized because filled in callee
Dim nTriplePlus2 As Int32
' out
Dim nQuadruple As Int32 = 0
' ref parameters must be initialized or assigned
' otherwise you receive ERROR : Use of unassigned local variable nQuadruple
app1.XPower(3, nQuadruple, nTriple1, nTriplePlus2)
Console.WriteLine("ByVal1: {0}", nTriple1.ToString())
' out parameter,
' 0
Console.WriteLine("ByRef: {0}", nQuadruple.ToString())
' ref parameter,
' 81
Console.WriteLine("ByVal2: {0}", nTriplePlus2.ToString())
' out parameter
' 0
' you should not use ref for returning values; use it if you really
' need in-place change
' note that in parameters are also references, but const, so you
' cannot change them.
Console.ReadLine()
End Sub
End Class
Screen Output Generated from above example
Now presents a complete array example with ByVal and ByRef parameters.
Parameter Modifiers Example 2
// ByVal & ByRef - passing arrays
Imports System
Class MyApp
' out
Public Shared Sub FillArray(ByVal myArray As Integer())
' Initialize the array:
myArray = New Integer(5) {1, 2, 3, 4, 5, 6}
End Sub
' ref
Public Shared Sub FillArray2(ByRef arr As Integer())
' Create the array on demand:
If arr Is Nothing Then
arr = New Integer(10) {}
End If
' Otherwise fill the array:
arr(0) = 19
arr(4) = 1919
End Sub
' implicit ref default for references, not in
Public Shared Sub WriteArray(ByVal myArray As Integer())
' myArray[2] = 19; // CAVEAT: this is also valid
Console.WriteLine("Array elements are:")
Dim i As Integer = 0
While i < myArray.Length
Console.WriteLine(myArray(i))
System.Math.Max(System.Threading.Interlocked.Increment(i), i - 1)
End While
End Sub
Public Shared Sub Main()
' Initialize the array:
Dim myArray2 As Integer() = {1, 2, 3, 4, 5}
FillArray2(myArray2)
WriteArray(myArray2)
Console.ReadLine()
End Sub
End Class
Screen Output Generated from above example
Parameter Modifiers Example 3
Imports System
Public Class SomeItems
Public One As Integer
Public Two As String
End Class
Public Class App
Public m_three As Integer = 5
Public Function methodTwo(ByVal o As SomeItems, ByVal s As String) As Integer
o.One = m_three
s = "BlaBla"
Return 0
End Function
Public Function methodTwo2(ByVal o As SomeItems) As Integer
o.One = m_three
o.Two = "Is Gone"
Return 0
End Function
Public Shared Sub Main(ByVal args As String())
Dim _a As New App()
Dim si As New SomeItems()
si.One = 1
si.Two = "Goodbye string"
Console.WriteLine("Before = {0} - {1}", si.One, si.Two)
_a.methodTwo(si, si.Two)
Console.WriteLine("After = {0} - {1}", si.One, si.Two)
_a.methodTwo2(si)
Console.WriteLine("After = {0} - {1}", si.One, si.Two)
Console.ReadLine()
Return
End Sub
End Class
Screen Output Generated from above example
Conclusion
Hope this article would have helped you in understanding Method Parameter Types in C#. See other articles on the website on .NET and C#.