gpt4 book ai didi

.NET:传递引用是谎言?

转载 作者:行者123 更新时间:2023-12-03 18:17:24 24 4
gpt4 key购买 nike

我遇到了一个有趣的案例,其中传递引用在 VB.NET 中似乎不起作用。我在下面提供了一些示例代码供大家使用。任何人都可以解释这种现象。这是有意的,还是语言/编译器的错误?

我在这段代码中看到的是“增量后”读数与“增量前”读数相同。

Public Class Wrapper
Public Property Value As Integer
End Class

Sub Main()

Dim rand As New Random()

Dim w As New Wrapper()
w.Value = rand.Next()
Console.WriteLine("Before Increment: {0}", w.Value)

Try
Increment(w.Value)
Catch ex As Exception
End Try

Console.WriteLine("After Increment: {0}", w.Value)

Console.ReadLine()
End Sub

Public Sub Increment(ByRef i As Integer)
i += 1
Throw New Exception()
End Sub

最佳答案

I encountered an interesting case where pass-by-reference does not appear to work in VB.NET.



事实上,这是一个非常有趣的案例。

I've supplied some sample code below for you all to play with. Can anyone explain this phenomenon.



是的。

Is this intended, or a bug with the language/compiler?



此行为是设计使然,它不是错误。 你不应该写这样的 VB 代码 .如果这样做时会痛, 停止这样做 .

这一切都说得通,但你必须理解其中的逻辑。跟着
  • byref 是变量的别名。也就是说,当您将变量传递给采用 byref 的方法时,形式参数将成为该变量的别名。我们有一个有两个名字的变量。
  • 属性不是变量。属性是一对方法:getter 和 setter。属性可能由变量支持,但属性不是变量。它是一个产生值的 getter 和一个接收值的 setter。确保您清楚值和变量之间的区别。变量包含值。
  • 如果您尝试将属性传递给需要 byref 参数的方法,会发生什么?在 C# 中,这是非法的。 在 VB 中,编译器为您生成一个临时变量,并使用复制输入复制输出语义通过 ref 传递它 .也就是说,你的程序相当于:

  • Try
    Dim Temp As Integer
    Temp = w.Value ' copy-in
    Increment(Temp) ' make an alias to Temp
    w.Value = Temp ' copy-out
    Catch ex As Exception
    End Try

    现在应该很明显为什么您的程序具有它所做的行为。 抛出发生在复制之前 .

    人们常说 C# 和 VB 是语法不同的“同一种语言”,这是有一定道理的。但是,显示出细微差异的示例表明这些语言具有不同的设计原则。 C# 和 VB 对 ref 传递的值的处理不同并不是偶然的!

    C# 的设计原则包括编译器应该在代码看起来错误时告诉您,特别是编译器不应该通过猜测您的意思来“掩盖”问题,并且将代码发送到某种程度使其在大多数情况下都能工作。设计团队将 C# 程序员的态度视为“编译器是我的 friend ,当我错了时会告诉我,以便我改进”。

    VB 的设计原则包括代码可能工作得很好,如果有些东西看起来不太正确,弄清楚用户的意思并使其工作,即使这意味着引入不保留对象的代码身份,或添加一个隐藏的copy-in-copy-out 或其他什么。设计团队认为 VB 程序员的态度是“编译器经常阻碍我;我已经表达了一个意图,所以让它工作”。

    这两种设计原则都是完全合理的,而且每种设计原则都有大量的开发人员支持。我觉得微软花了几十年的时间把语言开发的费用加倍,让开发者有能力选择适合自己气质的语言,这真是太好了。

    也就是说:在 C# 中有一些情况编译器会做类似的事情:创建一个临时变量,为其分配一个值,然后通过 ref 传递变量。

    挑战:创建一个程序来演示这个事实。

    提示#1:出于某种原因,可变结构在 C# 中是一种不好的做法。

    提示#2:在什么情况下变量被视为 C# 中的值?

    关于.NET:传递引用是谎言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52193306/

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