gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:09:28 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com