也许这是Visual 2022 (当前版本)中的一个bug .但是,根据到目前为止我对ByVal与ByRef的了解,以及这个文档:
...如果基础元素是可修改的,但不希望过程能够更改其值,则声明参数ByVal。只有调用代码才能更改通过值传递的可修改元素的值。..。
我希望这段代码:
Friend Sub Driver()
Dim index As Integer = 5
Dim OneDimensionalMatrix(index) As Integer
For x As Integer = 0 To index - 1
OneDimensionalMatrix(x) = 44
Next
SubRoutine(index, OneDimensionalMatrix)
Console.WriteLine(index)
Console.WriteLine(OneDimensionalMatrix(3))
End Sub
Public Sub SubRoutine(ByVal matrixSize As Integer, ByVal OneDimensionalMatrix() As Integer)
For x As Integer = 0 To matrixSize - 1
OneDimensionalMatrix(x) = 55
Next
matrixSize = 100
End Sub将产生以下产出:
5
44
但它正在产生以下产出:
5
55
对我来说,这意味着OneDimensionalMatrix的OneDimensionalMatrix被当作ByRef声明来处理。
我是遗漏了什么,还是这是VS 2022中的一个bug?
发布于 2022-04-12 07:18:47
以下是通过值传递或引用的非常简单的规则:
<代码>G29
如果不修改影响原始变量的对象,就无法传递引用类型对象。如果这是您想要的,那么就由您显式创建对象的副本并将其传递给方法。
通过值传递方法参数就像给另一个变量赋值一样。它创建原始变量内容的副本。如果该内容是值,则复制该值,如果该内容是引用,则复制引用。如果复制引用,则对同一个对象有两个引用,而不是两个对象。您希望在这里输出什么:
Dim arr1 = {1, 2, 3}
Dim arr2 = arr1
arr2(1) = 5
Console.WriteLine(arr1(1))希望您说的是"5“,因为希望您认识到arr1和arr2都引用相同的数组对象。当您通过值将数组(或任何引用类型对象)传递给方法时,情况也是如此。
这种行为正是为什么ByVal在VB.NET中是默认的,而在VB6中它是ByRef。在VB6中,大型对象在默认情况下是复制的,因此必须通过引用传递才能避免这种情况。在VB.NET中,默认情况下不复制大型对象,因此只通过引用传递--实际上您希望传递与传入的对象不同的对象。值类型在默认情况下被复制的事实是值类型只应该是小的主要原因之一。我相信建议不超过32个字节,也就是最多8个字段。
https://stackoverflow.com/questions/71837263
复制相似问题