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

时间:2018-11-07 14:41:44

标签: arrays vb.net parameters byval

作为一个初学者,我的问题是,如果数组是通过byval传递的,那么参数会得到什么呢?我知道数组是一种引用类型。   我的猜测是,数组参数byval(从参数保留数组)应该获取参数hold的引用的副本,因此,一旦 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 有人可以给个小费吗?

1 个答案:

答案 0 :(得分:4)

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

ReDim arr1(100)

在功能上等效于此:

arr1 = New Integer(100) {}

因此,在您的方法中,您将创建两个新数组并将它们分配给参数。由于第一个参数已声明为ByVal,因此在方法返回后,您作为参数传递给该参数的变量将保持不变,即Array1仍具有11个元素,并且它们都具有默认值。因为第二个参数被声明为ByRef,所以它受您在方法中的操作的影响,因此它具有101个元素,第三个参数是您在方法内部设置的元素。

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