2012-12-22 37 views
-1

我想了解下面的问题。我想知道为什么B == AC == B在下面的程序中是错误的。C#中的参考类型比较#

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); 
     } 
    } 
} 

输出:


+3

请解释为什么你的结果让你感到惊讶。 –

+0

因为我意识到这个概念在我脑海中并不清楚。但是现在我对下面的答案感到满意。 –

回答

1

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

在你的情况下,AObjectA的参考,B是对ObjectB的参考。

当你定义Class1 C = A;

  • 首先,您将创建两个的事情。一个称为ObjectC的对象和对该对象的引用称为C
  • 然后您将A的参考复制到参考C。现在,A和C是指同一个对象

当您使用==参照对象,如果他们引用了相同OBJETS,它返回true,否则返回false

在你的情况,这就是为什么B == AC == B回报false,但如果你有A == C尝试,它返回true

+0

非常感谢。现在我想到的还有一件事,C.Equals(A)和C == A是一样的吗? –

+0

@MazharKhan如果'C.Equals(A)'返回'true',这并不意味着'C'等于'A'。这意味着'C'和'A'是对同一个对象的引用。因为'A'和'C'只是参考。他们不是对象。阅读MSDN的[Object.Equals()](http://msdn.microsoft.com/zh-cn/library/bsc2ak47.aspx)方法。 –

0

输出是您要比较的引用正确。这里A和B是不同的对象,因此它们在比较中导致错误.A,B全部位于不同的存储位置,因此它们的引用不相等。

0

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

2

A和B是不同的对象。他们是同一个班级,但不是同一个班级。就像两个人都可以成为人,但他们不是同一个人。

1

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

在你的例子中,如果你要测试A == C,你会发现它返回true,因为它们都指向内存中的相同位置。

+0

你是对的,我更新了我的答案,以更好地解释这一点。 – lumberjack4