【问题标题】:Object equality in .NET.NET 中的对象相等
【发布时间】:2011-01-07 23:44:30
【问题描述】:

我觉得问这个很无知,但是有人可以向我解释为什么会这样吗?

类 MyClass { public int i {get;放; } } 课堂节目 { 静态无效主要(字符串 [] 参数) { MyClass a = new MyClass(); MyClass b = new MyClass(); b.i = 2; a = b; a.i = 1; Console.Write(b.i + "\n"); //输出 1 } }

这对我来说是有意义的,因为我使用了指针和所有很棒的东西,但我的印象是,在 C# 中,“b”将保持独立于“a”。

我只是在使用一些非常糟糕的做法吗?也许有人可以向我指出一些可以解释为什么在 C# 中如此的东西?

谢谢。

【问题讨论】:

    标签: c# object equality


    【解决方案1】:

    正是这一行让你感到困惑:

    a = b;
    

    您希望将b 按值复制到a,但实际上发生的只是您已将b 的引用分配给a

    .Net 将世界分为两类:引用类型和值类型(还有委托类型和其他一些类型,但这是另一回事)。您定义的任何类都是引用类型,关于引用类型有一些重要的事情需要记住:

    • 没有内置方法可以进行深层复制
    • 仔细检查相等性。 == 用于引用相等(变量是否引用 same 对象)而 .Equals() 用于值相等,您可能需要覆盖 .Equals()(和 GetHashCode())让您的类型做到这一点。
    • assignment 只是复制引用(这是咬你的部分)

    【讨论】:

    • 谢谢,我觉得自己很愚蠢,但感谢您的解释。
    【解决方案2】:

    您正在使用指针。对象被引用引用,除非它们来自ValueType

    所以

    a = b;
    

    将引用 a 设置为等于对 b 的引用。

    【讨论】:

      【解决方案3】:

      您需要了解的是,实际上有 4 个感兴趣的实体。

      1. MyClass 的实例 #1
      2. MyClass 的实例 #2
      3. MyClass 参考 a
      4. MyClass 参考 b

      最初引用 a 引用实例 #1,引用 b 引用实例 #2。直到您执行a=b; 行。在此行之后,引用 a 和引用 b 都指向实例 #1。因此,当您调用b.i 时,您实际上是在询问实例#1 如果i 是什么值。不是实例#2。

      【讨论】:

        【解决方案4】:

        没有指针与没有对象引用不同。在您的情况下,“a”是对 MyClass 类型的特定对象以及“b”的引用。当您执行“a = b”时,您复制的是引用,而不是对象,因此“a”指向与“b”相同的对象。

        【讨论】:

          【解决方案5】:

          a 和 b 是引用,所以在a = b 行之后,a 和 b 指的是同一个对象(并且原来由 a 指向的对象不再可达)。因此,当您设置 a.i 时,您也在更新 b 引用的对象,因此发生了变化。

          【讨论】:

            【解决方案6】:

            .NET 中的每个类都是引用类型。这意味着当你创建一个新实例时,它指向内存中的一个引用,而不是保存它的值。

            在您的情况下,当您使用= operator(赋值)时,您只需将对象a 的指针也与对象b 的指针相关联。在这个操作之后,对象上的每一次交互都会被反射到另一个对象上,因为它们只是指向同一个东西。

            如果你需要复制一个对象,你必须自己编写代码。但这是另一回事了。

            【讨论】:

              猜你喜欢
              • 2012-04-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-03-11
              • 2011-07-16
              • 1970-01-01
              • 2011-12-20
              相关资源
              最近更新 更多