【问题标题】:Reference Type comparison in C#C# 中的引用类型比较
【发布时间】:2012-12-22 17:10:27
【问题描述】:

我试图理解以下问题。我想知道为什么B == AC == B在下面的程序中是假的。

using System;

namespace Mk
{
    public class Class1
    {
        public int i = 10;
    }
    class Program
    {
        static void Main(string[] args)
        {
            Class1 A = new Class1();
            Class1 B = new Class1();
            Class1 C = A;

            Console.WriteLine(B == A);
            Console.WriteLine(C == B);
        }
    }
}

输出:

错误
假的

【问题讨论】:

  • 请解释为什么结果让您感到惊讶。
  • 因为我意识到这个概念在我的脑海中并不清楚。但现在我对以下答案感到满意。

标签: c# .net oop class reference-type


【解决方案1】:

A 和 B 是不同的对象。它们属于同一类,但不是同一实例。就像两个人都可以是人,但他们不是同一个人。

【讨论】:

    【解决方案2】:

    在 .NET 中,类是引用类型。引用类型有两件事。 对象对对象的引用

    在您的情况下,A 是对 ObjectA 的引用,B 是对 ObjectB 的引用。

    当你定义Class1 C = A;

    • 首先,您创建两个东西。一个名为 ObjectC 的对象和一个名为 C 的对象的引用。
    • 然后将A 的引用复制到C 的引用。现在,A 和 C 引用同一个对象

    == 与引用对象一起使用时,如果它们引用相同的对象,则返回true,否则返回false

    在您的情况下,这就是为什么 B == AC == B 返回 false,但如果您尝试使用 A == C,它返回 true

    【讨论】:

    • 非常感谢。现在我在想的另一件事是,C.Equals(A) 和 C==A 是一样的吗?
    • @MazharKhan 如果C.Equals(A) 返回true,并不意味着C 等于A。这意味着CA 引用同一个对象。因为AC 只是参考。它们不是对象。从 MSDN 中读取 Object.Equals() 方法。
    【解决方案3】:

    您正在比较两个类实例的引用。由于 A 和 B 位于不同的内存位置,因此它们的引用不相等。如果要测试类相等性,则需要覆盖 Equals() 方法。 http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx

    在您的示例中,如果您要测试 A == C,您会看到它返回 true,因为它们都指向内存中的相同位置。

    【讨论】:

      【解决方案4】:

      引用类型将地址保存在内存中。在您的情况下,A 和 B 完全指向不同的地址。但是,由于您将 A 分配给 C,因此 C 指向的地址与 A 相同。

      【讨论】:

        【解决方案5】:

        当您尝试比较参考时,输出是正确的。这里 A 和 B 是不同的对象,因此它们在比较时会导致错误。A、B 都在不同的内存位置,因此它们的引用不相等。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-26
          • 2012-09-14
          • 1970-01-01
          • 1970-01-01
          • 2015-02-10
          • 2020-01-06
          • 2014-08-19
          相关资源
          最近更新 更多