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

Huang Qinlai

作为一个初学者,我的问题是,如果数组通过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,有人可以给个小费吗?

金西尼

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

ReDim arr1(100)

在功能上等效于此:

arr1 = New Integer(100) {}

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章