首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ByVal表现得像ByRef

ByVal表现得像ByRef
EN

Stack Overflow用户
提问于 2022-04-12 04:50:43
回答 1查看 69关注 0票数 1

也许这是Visual 2022 (当前版本)中的一个bug .但是,根据到目前为止我对ByVal与ByRef的了解,以及这个文档:

https://learn.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/procedures/passing-arguments-by-value-and-by-reference#:~:text=The%20advantage%20of%20passing%20an,being%20changed%20by%20the%20procedure

...如果基础元素是可修改的,但不希望过程能够更改其值,则声明参数ByVal。只有调用代码才能更改通过值传递的可修改元素的值。..。

我希望这段代码:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-12 07:18:47

以下是通过值传递或引用的非常简单的规则:

  1. 在通过值传递值类型(结构)时,无论修改对象还是赋值新对象都不会影响原始变量。
  2. 在通过引用传递值类型时,修改对象和分配新对象都会影响原始变量。
  3. 在通过值传递引用类型(类)时,修改对象将影响原始变量,但分配新对象不会影响原始变量。当通过引用类型传递引用类型时,修改对象和分配新对象都会影响原始变量。

<代码>G29

如果不修改影响原始变量的对象,就无法传递引用类型对象。如果这是您想要的,那么就由您显式创建对象的副本并将其传递给方法。

通过值传递方法参数就像给另一个变量赋值一样。它创建原始变量内容的副本。如果该内容是值,则复制该值,如果该内容是引用,则复制引用。如果复制引用,则对同一个对象有两个引用,而不是两个对象。您希望在这里输出什么:

代码语言:javascript
复制
Dim arr1 = {1, 2, 3}
Dim arr2 = arr1

arr2(1) = 5

Console.WriteLine(arr1(1))

希望您说的是"5“,因为希望您认识到arr1arr2都引用相同的数组对象。当您通过值将数组(或任何引用类型对象)传递给方法时,情况也是如此。

这种行为正是为什么ByVal在VB.NET中是默认的,而在VB6中它是ByRef。在VB6中,大型对象在默认情况下是复制的,因此必须通过引用传递才能避免这种情况。在VB.NET中,默认情况下不复制大型对象,因此只通过引用传递--实际上您希望传递与传入的对象不同的对象。值类型在默认情况下被复制的事实是值类型只应该是小的主要原因之一。我相信建议不超过32个字节,也就是最多8个字段。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71837263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档