VB.Net/Language Basics/ByVal
Содержание
- 1 Array parameter passed by Value and by Reference
- 2 Array passed By Value
- 3 Function with pass by value Parameter
- 4 Modify Array Element By Value
- 5 Object parameter passed by Value and by Reference
- 6 Passing arrays and individual array elements to procedures
- 7 Squares three values ByVal and ByRef, displays results
- 8 String parameter passed by Value and by Reference
- 9 Structure parameter passed by Value and by Reference
Array parameter passed by Value and by Reference
<source lang="vbnet"> Imports System public class MainClass
Shared Sub Main() Dim A As Integer() = {1, 2, 3, 4, 5} Dim B As Integer() B = A Console.WriteLine("Initial state ArrayTests") Console.WriteLine("Are A and B the same? " + (A Is B).ToString()) Console.WriteLine("Array A:") DisplayArray(A) Console.WriteLine("Array B") DisplayArray(B) FunctionPassArrayByReference1(B) Console.WriteLine("After FunctionPassArrayByReference1") Console.WriteLine("Are A and B the same? " + (A Is B).ToString()) Console.WriteLine("Array A:") DisplayArray(A) Console.WriteLine("Array B") DisplayArray(B) A(0) = 1 B = A FunctionPassArrayByReference2(B) Console.WriteLine("After FunctionPassArrayByReference2") Console.WriteLine("Are A and B the same? " + (A Is B).ToString()) Console.WriteLine("Array A:") DisplayArray(A) Console.WriteLine("Array B") DisplayArray(B) A(0) = 1 B = A FunctionPassArrayByValue1(B) Console.WriteLine("After FunctionPassArrayByValue1") Console.WriteLine("Are A and B the same? " + (A Is B).ToString()) Console.WriteLine("Array A:") DisplayArray(A) Console.WriteLine("Array B") DisplayArray(B) A(0) = 1 B = A FunctionPassArrayByValue2(B) Console.WriteLine("After FunctionPassArrayByValue2") Console.WriteLine("Are A and B the same? " + (A Is B).ToString()) Console.WriteLine("Array A:") DisplayArray(A) Console.WriteLine("Array B") DisplayArray(B)
End Sub Shared Public Sub FunctionPassArrayByReference1(ByRef Y As Integer()) Y(0) = 5 End Sub Shared Public Sub FunctionPassArrayByReference2(ByRef Y As Integer()) Dim NewArray As Integer() = {2, 3, 4, 5, 6} Y = NewArray End Sub Shared Public Sub FunctionPassArrayByValue1(ByVal Y As Integer()) Y(0) = 5 End Sub Shared Public Sub FunctionPassArrayByValue2(ByVal Y As Integer()) Dim NewArray As Integer() = {2, 3, 4, 5, 6} Y = NewArray End Sub Shared Public Sub DisplayArray(ByVal Y As Integer()) Dim X As Integer For X = 0 To UBound(Y) Console.Write(Y(X).ToString) If X <> UBound(Y) Then Console.Write(", ") Else Console.WriteLine() End If Next End Sub
End Class
</source>
Array passed By Value
<source lang="vbnet"> Imports System Public Class MainClass
Shared Sub Main(ByVal args As String()) Dim i As Integer Dim firstArray As Integer() Dim firstArrayCopy As Integer() firstArray = New Integer() {1, 2, 3} firstArrayCopy = firstArray Console.WriteLine("Test passing array reference using ByVal.") Console.WriteLine("Contents of firstArray before calling FirstDouble: ") For i = 0 To firstArray.GetUpperBound(0) Console.WriteLine(firstArray(i)) Next " pass firstArray using ByVal FirstDouble(firstArray) Console.WriteLine("Contents of firstArray after calling FirstDouble: ") " print contents of firstArray For i = 0 To firstArray.GetUpperBound(0) Console.WriteLine(firstArray(i) & " ") Next " test whether reference was changed by FirstDouble If firstArray Is firstArrayCopy Then Console.WriteLine("The references are equal.") Else Console.WriteLine("The references are not equal.") End If
End Sub " procedure modifies elements of array and assigns " new reference (note ByVal) Shared Sub FirstDouble(ByVal array As Integer()) Dim i As Integer " double each element value For i = 0 To array.GetUpperBound(0) array(i) *= 2 Next " create new reference, assign it to array array = New Integer() {11, 12, 13} End Sub
End Class
</source>
Function with pass by value Parameter
<source lang="vbnet"> Imports System Public Class MainClass
Shared Sub Main() Dim A() As String = {"HELLO", "GOODBYE"} Console.WriteLine("Original first item in array is: " _ & A(0)) Console.WriteLine("Original second item in array is: " _ & A(1)) AFunction(A) Console.WriteLine("After passing by value first item in array now is: " _ & A(0)) Console.WriteLine("After passing by value second item in array is: " _ & A(1)) End Sub Shared Sub AFunction(ByVal Foo As String()) Foo(0) = "GOODBYE" Foo(1) = "HELLO" End Sub
End Class
</source>
Modify Array Element By Value
<source lang="vbnet"> Imports System Public Class MainClass
Shared Sub Main(ByVal args As String()) Dim array1 As Integer() = New Integer() {1, 2, 3, 4, 5} Dim i As Integer Console.WriteLine( "The values of the original array are:" & vbCrLf ) " display original elements of array1 For i = 0 To array1.GetUpperBound(0) Console.WriteLine( " " & array1(i) ) Next Console.WriteLine( vbCrLf & vbCrLf & _ "EFFECTS OF PASSING ARRAY ELEMENT " & _ "BY VALUE:" & vbCrLf & vbCrLf & "array1(3) " & _ "before ModifyElementByVal: " & array1(3) ) " array element passed by value ModifyElementByVal(array1(3))
End Sub Shared Sub ModifyElementByVal(ByVal element As Integer) Console.WriteLine( vbCrLf & "Value received in " & _ "ModifyElementByVal: " & element ) element *= 2 Console.WriteLine( vbCrLf & "Value calculated in " & _ "ModifyElementByVal: " & element ) End Sub " ModifyElementByVal
End Class
</source>
Object parameter passed by Value and by Reference
<source lang="vbnet"> Imports System public class MainClass
Shared Sub Main() Dim A As New MyObject() Dim B As MyObject = A A.X = 1 Console.WriteLine("Initial state") Console.WriteLine("Are A and B the same? " + (A Is B).ToString()) Console.WriteLine("A.x: " + A.X.ToString() + " B.x " + B.X.ToString()) FunctionPassObjectByReference1(B) Console.WriteLine("After FobjByRef1") Console.WriteLine("Are A and B the same? " + (A Is B).ToString()) Console.WriteLine("A.x: " + A.X.ToString() + " B.x " + B.X.ToString()) A.X = 1 B = A FunctionPassObjectByReference2(B) Console.WriteLine("After FobjByRef2") Console.WriteLine("Are A and B the same? " + (A Is B).ToString()) Console.WriteLine("A.x: " + A.X.ToString() + " B.x " + B.X.ToString()) A.X = 1 B = A FunctionPassObjectByValue1(B) Console.WriteLine("After FobjByVal1") Console.WriteLine("Are A and B the same? " + (A Is B).ToString()) Console.WriteLine("A.x: " + A.X.ToString() + " B.x " + B.X.ToString()) A.X = 1 B = A FunctionPassObjectByValue2(B) Console.WriteLine("After FobjByVal2") Console.WriteLine("Are A and B the same? " + (A Is B).ToString()) Console.WriteLine("A.x: " + A.X.ToString() + " B.x " + B.X.ToString()) End Sub Shared Public Sub FunctionPassObjectByReference1(ByRef Y As MyObject) Y.X = 5 End Sub Shared Public Sub FunctionPassObjectByReference2(ByRef Y As MyObject) Y = New MyObject() Y.X = 5 End Sub Shared Public Sub FunctionPassObjectByValue1(ByVal Y As MyObject) Y.X = 5 End Sub Shared Public Sub FunctionPassObjectByValue2(ByVal Y As MyObject) Y = New MyObject() Y.X = 5 End Sub Class MyObject Public X As Integer End Class
End Class
</source>
Passing arrays and individual array elements to procedures
<source lang="vbnet"> Imports System Public Class MainClass
Shared Sub Main(ByVal args As String()) Dim array1 As Integer() = New Integer() {1, 2, 3, 4, 5} Dim i As Integer Console.WriteLine( "The values of the original array are:" & vbCrLf ) " display original elements of array1 For i = 0 To array1.GetUpperBound(0) Console.WriteLine( " " & array1(i) ) Next ModifyArray(array1) " array is passed by reference Console.WriteLine( vbCrLf & _ "The values of the modified array are:" & vbCrLf ) " display modified elements of array1 For i = 0 To array1.GetUpperBound(0) Console.WriteLine(" " & array1(i) ) Next End Sub " procedure modifies array it receives (note ByVal) Shared Sub ModifyArray(ByVal arrayParameter As Integer()) Dim j As Integer For j = 0 To arrayParameter.GetUpperBound(0) arrayParameter(j) *= 2 Next End Sub " ModifyArray
End Class
</source>
Squares three values ByVal and ByRef, displays results
<source lang="vbnet"> Imports System Public Class MainClass
Shared Sub Main(ByVal args As String()) Dim number1 As Integer = 2 Console.WriteLine("Passing a value-type argument by value:") Console.WriteLine("Before calling SquareByValue, " & _ "number1 is {0}", number1) SquareByValue(number1) " passes number1 by value Console.WriteLine("After returning from SquareByValue, " & _ "number1 is {0}" & vbCrLf, number1) Dim number2 As Integer = 2 Console.WriteLine("Passing a value-type argument" & _ " by reference:") Console.WriteLine("Before calling SquareByReference, " & _ "number2 is {0}", number2) SquareByReference(number2) " passes number2 by reference Console.WriteLine("After returning from " & _ "SquareByReference, number2 is {0}" & vbCrLf, number2) Dim number3 As Integer = 2 Console.WriteLine("Passing a value-type argument" & _ " by reference, but in parentheses:") Console.WriteLine("Before calling SquareByReference " & _ "using parentheses, number3 is {0}", number3) SquareByReference((number3)) " passes number3 by value Console.WriteLine("After returning from " & _ "SquareByReference, number3 is {0}", number3) End Sub
" squares number by value (note ByVal keyword) Shared Sub SquareByValue(ByVal number As Integer) Console.WriteLine("After entering SquareByValue, " & _ "number is {0}", number) number *= number Console.WriteLine("Before exiting SquareByValue, " & _ "number is {0}", number) End Sub " SquareByValue " squares number by reference (note ByRef keyword) Shared Sub SquareByReference(ByRef number As Integer) Console.WriteLine("After entering SquareByReference" & _ ", number is {0}", number) number *= number Console.WriteLine("Before exiting SquareByReference" & _ ", number is {0}", number) End Sub " SquareByReference
End Class
</source>
String parameter passed by Value and by Reference
<source lang="vbnet"> Imports System public class MainClass
Shared Sub Main() Dim A As String = "Hello" Dim B As String B = A Console.WriteLine(Chr(10) + "Initial state StringTests") Console.WriteLine("Are A and B the same? " + (A Is B).ToString()) Console.WriteLine("A: " + A + " B: " + B) FunctionPassStringByReference1(B) Console.WriteLine("After FunctionPassStringByReference1") Console.WriteLine("Are A and B the same? " + (A Is B).ToString()) Console.WriteLine("A: " + A + " B: " + B) A = "Hello" B = A FunctionPassStringByReference2(B) Console.WriteLine("After FunctionPassStringByReference2") Console.WriteLine("Are A and B the same? " + (A Is B).ToString()) Console.WriteLine("A: " + A + " B: " + B) A = "Hello" B = A FunctionPassStringByReference3(B) Console.WriteLine("After FunctionPassStringByReference3") Console.WriteLine("Are A and B the same? " + (A Is B).ToString()) Console.WriteLine("Are A and B equal? " + (A = B).ToString()) Console.WriteLine("A: " + A + " B: " + B) A = "Hello" B = A FunctionPassStringByValue1(B) Console.WriteLine("After FunctionPassStringByValue1") Console.WriteLine("Are A and B the same? " + (A Is B).ToString()) Console.WriteLine("A: " + A + " B: " + B) A = "Hello" B = A FunctionPassStringByValue2(B) Console.WriteLine("After FunctionPassStringByValue2") Console.WriteLine("Are A and B the same? " + (A Is B).ToString()) Console.WriteLine("A: " + A + " B: " + B) End Sub Shared Public Sub FunctionPassStringByReference1(ByRef Y As String) Mid$(Y, 1, 1) = "A" End Sub Shared Public Sub FunctionPassStringByReference2(ByRef Y As String) Y = "Hello" End Sub Shared Public Sub FunctionPassStringByReference3(ByRef Y As String) Mid$(Y, 1, 1) = "H" End Sub Shared Public Sub FunctionPassStringByValue1(ByVal Y As String) Mid$(Y, 1, 1) = "A" End Sub Shared Public Sub FunctionPassStringByValue2(ByVal Y As String) Y = "Hello" End Sub
End Class
</source>
Structure parameter passed by Value and by Reference
<source lang="vbnet"> Imports System public class MainClass
Shared Sub Main() Dim A As MyStruct Dim B As MyStruct A.X = 1 B = A Console.WriteLine("Initial state StructTests") Console.WriteLine("Are A and B the same? " + (A.Equals(B)).ToString()) Console.WriteLine("A.x: " + A.X.ToString() + " B.x " + B.X.ToString()) FunctionPassStructureByReference1(B) Console.WriteLine("After FunctionPassStructureByReference1") Console.WriteLine("Are A and B the same? " + (A.Equals(B)).ToString()) Console.WriteLine("A.x: " + A.X.ToString() + " B.x " + B.X.ToString()) A.X = 1 B = A FunctionPassStructureByReference2(B) Console.WriteLine("After FunctionPassStructureByReference2") Console.WriteLine("Are A and B the same? " + (A.Equals(B)).ToString()) Console.WriteLine("A.x: " + A.X.ToString() + " B.x " + B.X.ToString()) A.X = 1 B = A FunctionPassStructureByValue(B) Console.WriteLine("After FunctionPassStructureByValue") Console.WriteLine("Are A and B the same? " + (A.Equals(B)).ToString()) Console.WriteLine("A.x: " + A.X.ToString() + " B.x " + B.X.ToString()) A.X = 1 B = A FStructByVal2(B) Console.WriteLine("After FStructByVal2") Console.WriteLine("Are A and B the same? " + (A.Equals(B)).ToString()) Console.WriteLine("A.x: " + A.X.ToString() + " B.x " + B.X.ToString()) End Sub Shared Public Sub FunctionPassStructureByReference1(ByRef Y As MyStruct) Y.X = 5 End Sub Shared Public Sub FunctionPassStructureByReference2(ByRef Y As MyStruct) Y = New MyStruct() Y.X = 5 End Sub Shared Public Sub FunctionPassStructureByValue(ByVal Y As MyStruct) Y.X = 5 End Sub Shared Public Sub FStructByVal2(ByVal Y As MyStruct) Y = New MyStruct() Y.X = 5 End Sub
Structure MyStruct Public X As Integer End Structure
End Class
</source>