c#中的等号和哈希码冲突

时间:2015-10-18 21:21:45

标签: c# equals hashcode

我在c#中编写了以下代码:

public class Person
{
    private string idNumber;
    private string personName;
    public Person(string name, string id)
    {
        this.personName= name;
        this.idNumber= id;
    }
    public override bool Equals(Objectobj)
    {
        Person personObj= obj as Person;
        if(personObj== null) 
            return false;
        else 
            return idNumber.Equals(personObj.idNumber);
    }
    public override int GetHashCode()
    { 
        return this.idNumber.GetHashCode(); 
    }
}

public static void Main()
{
    Person p1 = new Person("John", "63412895");
    Person p2 = new Person("Jack", "63412895");
    Console.WriteLine(p1.Equals(p2));
    Console.WriteLine(Object.Equals(p1, p2));
}

我不明白为什么第二个Console.WriteLine()会返回真的??? 第一个返回true,因为我覆盖了相等的方法。 但第二个与对象类相等。 请解释一下。

5 个答案:

答案 0 :(得分:5)

静态object.Equals方法定义为

public static bool Equals(Object objA, Object objB) 
{
    if (objA==objB) {
        return true;
    }
    if (objA==null || objB==null) {
        return false;
    }
    return objA.Equals(objB);
}

所以内部它在Equals检查后使用覆盖null

要比较引用,请使用object.ReferenceEquals或转换为object并使用==运算符。

object.ReferenceEquals(p1, p2)
(object)p1 == (object)p2

答案 1 :(得分:2)

引自Object.Equals(Object, Object)

上的MSDN文档
  

如果两个对象不表示相同的对象引用和   既不是null,它调用objA.Equals(objB)并返回结果。   这意味着如果objA重写Object.Equals(Object)方法,   调用此覆盖。

我相信您的方案中正是发生了什么。由于您已覆盖Equals方法,因此Object的静态方法会在内部调用它。

答案 2 :(得分:1)

第二行代码在内部检查p1是否为null并调用第一行。

所以你不能期望有不同的结果调用几乎相同的方法。

p1.Equals(p2);
Object.Equals(p1, p2);

答案 3 :(得分:-1)

我认为这与您还覆盖Object.Equals使用的GetHashcode这一事实有关。这是我的猜测。

答案 4 :(得分:-1)

你覆盖了GetHashCode。这就是对象平等所使用的。经典的例子是.Net中的两个对象objStringA =“MyVal”和ObjStringB ='MyVal'将返回相等,因为字符串会覆盖get哈希码。

就像你把它翻了两次。我不确定您是否需要在您的情况下覆盖Equals运算符。