Hua*_*lai 4 vb.net arrays parameters byval
作为初学者,我的问题是如果数组通过val传递,参数到底得到什么?我知道数组是一种引用类型。我的猜测是,数组参数 byval (从参数中保存数组)应该获取参数保存的引用的副本,因此,一旦子ArrayProcByRef更改了数组参数中的元素,参数也应该更改。
Sub Main() Handles MyBase.Load
Dim Array1(10) As Integer
Dim Array2(10) As Integer
ArrayProcByRef(Array1, Array2)
Console.WriteLine(UBound(Array1))
Console.WriteLine(UBound(Array2))
Console.WriteLine(Array1(2))
Console.WriteLine(Array2(2))
End Sub
Sub ArrayProcByRef(ByVal arr1() As Integer, ByRef arr2() As Integer)
ReDim arr1(100)
ReDim arr2(100)
arr1(2) = 11
arr2(2) = 22
End Sub
Run Code Online (Sandbox Code Playgroud)
上面是我的代码,很简单,输出是 10,100,0,22 任何人都可以提供提示吗?
声明引用类型参数的目的ByRef是,您可以将不同的对象分配给方法内的该参数,并影响原始变量,这正是代码中发生的情况。 ReDim不会更改现有数组。它创建指定大小的新数组并将其分配给同一变量。这:
ReDim arr1(100)
Run Code Online (Sandbox Code Playgroud)
功能上等价于:
arr1 = New Integer(100) {}
Run Code Online (Sandbox Code Playgroud)
因此,在您的方法中,您创建两个新数组并将它们分配给参数。因为第一个参数已声明ByVal,所以在方法返回后,作为实参传递给该参数的变量不会发生变化,即Array1仍然有 11 个元素,并且它们都有默认值。因为第二个参数是声明的ByRef,所以它会受到您在方法中所做的操作的影响,因此它有 101 个元素,第三个参数是您在方法中设置的内容。
现在,如果您删除ReDim语句并仅保留赋值,您会发现两个变量都受到更改的影响。这是因为数组是引用类型对象,因此您在方法内部修改的数组对象与您在方法外部访问的对象相同。修改引用类型对象会影响原始变量,无论是使用ByVal还是ByRef将新对象分配给参数时,仅在使用时影响原始变量ByRef。