VB.NET数组参数机制,byval和byref

VB.NET array parameter mechanism, byval and byref

作为一个初学者,我的问题是如果一个数组通过byval传递,参数到底是什么?我知道数组是一种引用类型。 我的猜测是数组参数 byval(保存参数中的数组)应该获取参数保存的引用的副本,因此,一旦 sub A​​rrayProcByRef 更改了元素array 参数,argument 应该改变。

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

以上是我的代码,很简单,输出10,100,0,22 谁能给个小费?

声明引用类型参数 ByRef 的目的是让您可以在方法内为该参数分配一个不同的对象并影响原始变量,而这正是您的代码中发生的事情。 ReDim 不会更改现有数组。它创建一个指定大小的新数组并将其分配给同一个变量。这个:

ReDim arr1(100)

在功能上等同于:

arr1 = New Integer(100) {}

因此,在您的方法中,您创建了两个新数组并将它们分配给参数。因为第一个参数被声明为ByVal,你作为参数传递给该参数的变量在方法returns之后没有改变,即Array1仍然有11个元素,它们都有默认值.因为第二个参数是声明的ByRef,它受你在方法中所做的事情的影响,所以它有101个元素,第三个是你在方法内部设置的。

现在,如果您去掉 ReDim 语句而只留下赋值,您会发现两个变量都受到更改的影响。这是因为数组是引用类型对象,所以您在方法内修改的数组对象与您在方法外访问的对象相同。修改引用类型对象会影响原始变量,无论使用 ByVal 还是 ByRef 而将新对象分配给参数仅在使用 ByRef.

时影响原始变量