2015-10-18 72 views
2

我写在C#下面的代码:平等和hashCode碰撞

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 ??? 第一次返回true,因为我覆盖了等于的方法。 但第二个涉及在对象类中相等。请解释一下 。

+0

如果你的代码完全像我怀疑它编译 – csharpwinphonexaml

+0

我希望这是一个复制粘贴问题public override bool Equals(Objectobj)' – csharpwinphonexaml

+1

我注意到这是一个来自[这里]的示例(https:// msdn。 microsoft.com/en-us/library/bsc2ak47%28v=vs.110%29.aspx):) 请注意,这里是重写Equals方法,以便这些操作给出相同的结果: p1.Equals(p2) p2。 Equals(p1) Object.Equals(p1,p2) Object.Equals(p2,p1) 此外,哈希码仅由相同的idNumbers创建。 – marcinax

回答

-1

我认为这与你也重写Object.Equals使用的GetHashcode有关。这是我的猜测。

-1

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

这就像你两次覆盖它。需要等于运算在你的情况下被覆盖。

1

的第二行代码内部检查,如果P1为null,并调用第一线。

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

p1.Equals(p2); 
Object.Equals(p1, p2); 
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); 
} 

所以在内部它使用重写Equalsnull检查。

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

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

Object.Equals(Object, Object)

从MSDN文档引用如果两个对象不表示相同的对象基准和 既不为空时,它调用objA.Equals(objB)并返回结果。 这意味着如果objA重写Object.Equals(Object)方法,则调用此重写。

我相信这正是你的情况。由于您已覆盖Equals方法,因此它在内部由Object的静态方法调用。