3

作为一个初学者,我的问题是如果一个数组是按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

以上是我的代码,很简单,输出是 10,100,0,22 有人可以给点小费吗?

4

1 回答 1

4

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

ReDim arr1(100)

在功能上等同于:

arr1 = New Integer(100) {}

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

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

于 2018-11-07T14:49:48.720 回答