为何回归虚假?新人(“詹姆斯”)==新人(“詹姆斯”)?

时间:2010-08-03 11:09:33

标签: c# .net equals gethashcode

我有覆盖GetHashCodeEquals,两种方法都为不同的对象提供相同的结果,但为什么仍然会出错?

class Program
{
    static void Main(string[] args)
    {    
        Console.WriteLine(new Person("james") == new Person("james"));    
        Console.ReadKey();
    }    
}

class Person
{
    private string Name;

    public Person(string name)
    {
        Name = name;
    }
    public override int GetHashCode()
    {
        return 1;
    }
    public override bool Equals(object obj)
    {
        return true;
    }
}

5 个答案:

答案 0 :(得分:26)

因为==运算符默认引用相等性。它不会调用您的Equals方法。

如果需要,您可以覆盖==运算符。请参阅:Guidelines for Overriding Equals() and Operator ==

  

在C#中,有两种不同的相等:引用相等(也称为标识)和值相等。值相等是通常理解的相等含义:它意味着两个对象包含相同的值。例如,值为2的两个整数具有值相等性。引用相等意味着没有两个对象可供比较。相反,有两个对象引用,它们都引用同一个对象。

     

[...]

     

默认情况下,operator ==通过确定两个引用是否指示同一对象来测试引用相等性。因此,引用类型不必实现operator ==以获得此功能。当一个类型是不可变的,也就是说,实例中包含的数据不能改变时,重载operator ==来比较值的相等而不是引用相等可能是有用的,因为作为不可变对象,它们可以被认为是相同的因为它们具有相同的价值。在非不可变类型中覆盖operator ==不是一个好主意。

答案 1 :(得分:5)

如果这真的是你想要的那样,你必须单独覆盖==运算符。

http://msdn.microsoft.com/en-us/library/ms173147%28VS.80%29.aspx

答案 2 :(得分:2)

在这种情况下,

==是一个引用相等运算符。它比较两个引用是否相同。

new运算符始终创建对象,因此new Something() NEVER 将是对另一个new Something()的相同引用

您可以覆盖==运算符以执行值比较而不是参考比较。这就是例如String确实如此。

另见

相关问题

答案 3 :(得分:2)

是的dtb是你想要的

bool b = new Person("james").Equals(new Person("james")); 

代替

答案 4 :(得分:2)

==运算符检查两个变量是否实际上是字面上引用内存中的同一对象。在您的示例中,您将创建两个 James。它们可能是双胞胎(即它们可能具有相同的存储器占用空间),但它们不是同一个人(即它们具有两个不同的存储器位置)。如果你写了:

Person a = new Person("james");
Person b = a;
Console.WriteLine(a == b); 

你会得到true,因为a和b只是同一个詹姆斯的两个名字。