2013-07-17 18 views

回答

6

默認的相等比較引用類型是引用相等,這僅返回true如果兩個對象引用指向相同實例(即分別經由單個new語句創建)。這與測試值相等的值類型不同,如果它們的所有數據字段都相等(如您的案例中的兩個),則返回true。更多信息:Equality Comparisons (C# Programming Guide)

如果你想改變這種行爲,那麼你需要在你的類型上實現通用的IEquatable<T>接口,以便比較實例的屬性是否相等。運營商隨後會自動選擇該實施併產生預期結果。

編輯:這裏是IEquatable<Person>爲你的類的實現:

public class Person : IEquatable<Person> 
{ 
    public int Id { get; set; } 
    public int Name { get; set; } 

    public bool Equals(Person other) 
    { 
     if (other == null) 
      return false; 

     return Object.ReferenceEquals(this, other) || 
      this.Id == other.Id && 
      this.Name == other.Name; 
    } 

    public override bool Equals(object obj) 
    { 
     return this.Equals(obj as Person); 
    } 

    public override int GetHashCode() 
    { 
     int hash = this.Id.GetHashCode(); 
     if (this.Name != null) 
      hash ^= this.Name.GetHashCode(); 
     return hash; 
    } 
} 

guidelines上重寫==!=運營商(強調):

默認情況下,運算符==通過確定兩個引用是否指示相同的對象來測試引用相等性。因此,引用類型不必實現運營商==以獲得此功能。當一個類型是不可變的,也就是說,實例中包含的數據不能改變,重載運算符==來比較值相等性而不是引用相等性可能是有用的,因爲作爲不可變對象,它們可以被認爲是相同的,只要他們有相同的價值。 在非不可變類型中覆蓋運算符==不是一個好主意。

+0

您能否通過編輯您的答案給出一個帶有代碼的IEquatable 的示例?或者任何鏈接對我來說都足夠了。謝謝 –

3

這是因爲你沒有在你的班上覆蓋平等。現在,當你使用不同的時候,它會檢查參考平等。要改變這種情況,您需要重寫一些公平的事情:operator==,Equals(),並獲得最佳結果GetHashCode()

這是我會怎麼做它:

public static bool operator ==(Person one, Person two) 
{ 
    return one.Id == two.Id && one.Name == two.Name; 
} 
public static override bool Equals(Person one, Person two) 
{ 
    return one == two; 
} 
public override bool Equals(object obj) 
{ 
    return obj is Person && ((Person)obj) == this; 
} 
public bool Equals(Person other) 
{ 
    return other == this; 
} 
public override int GetHashCode() 
{ 
    unchecked 
    { 
     return 17 * Id * 31 * Name.GetHashCode(); 
    } 
} 

此外,您可以實現IEquatable<T>界面(我在上面所做的,你需要的是確保你的末尾添加: IEquatable<Person>您類頭(class Person等)),然後將實施。

+1

真的是壓倒一切的最佳方式嗎? 爲什麼不只是實現IEquatable? – Kippie

+0

@Kippie因爲它通常會被覆蓋。 –