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

标签 arrays vb.net parameters byval

作为初学者,我的问题是,如果一个数组是通过 byval 传递的,那么参数到底得到了什么?我知道数组是一种引用类型。
我的猜测是数组参数 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
任何人都可以给小费?

最佳答案

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

ReDim arr1(100)

在功能上等同于:
arr1 = New Integer(100) {}

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

现在,如果你摆脱了 ReDim语句并保留赋值,您会发现两个变量都受到更改的影响。这是因为数组是引用类型对象,因此您在方法内部修改的数组对象与您在方法外部访问的对象相同。修改引用类型对象会影响原始变量是否使用 ByValByRef当使用 ByRef 时,将新对象分配给参数只会影响原始变量.

关于arrays - VB.NET数组参数机制,byval和byref,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53191700/

相关文章:

java - 在java中将文本行存储在数组中

vb.net - 生成随机字符串

vb.net - 如何在 Visual Studio 2010 中构建 64 位 Visual Basic.NET?

.net - "PublicKeyToken <..> is not a valid extension type."错误?

C 语法理解 - 参数传递给函数

c - 尽管在这两种情况下,编译器在编译期间都不知道 n ,但编译器的工作在这两种情况下有何不同?

c - 我们如何在 C 中的数组中插入和检索不同数据类型的多个数据?

parameters - 为什么 Clojure 开发人员使用 "xs"作为函数参数?

java - Java如何对数据集进行排序

WPF枚举值作为ObjectDataProvider的方法参数