2015-10-18 67 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的靜態方法調用。