2016-01-13 51 views
1

我讀過一些關於重寫Equal和GetHashcode的內容,但是當我擁有一個像下面這樣簡單的自己的Equal方法時,我需要它嗎?我是否需要重寫Equal?

如果我必須重寫它:

這是爲什麼? - 重寫GetHashCode()時,我應該使用Id.GetHashCode()嗎?

public class Foo { 
    public Guid Id { get; } = new Guid(); 

    public bool Equal(Foo other) { 
     if (other == null) return false; 
     return Id == other.Id; 
    } 
} 
+0

@Muds但我上面的代碼不覆蓋等於?這只是一種新方法? – MrProgram

+0

如果沒有其他約定,那麼您並不需要,但我沒有看到重新發明輪子的理由,因爲它不會與所有比較兩個實例的默認實現結合使用。 – dryman

回答

4

您的代碼看起來像要爲對象實現IEquatable<Foo>。和MSDN建議oveeride Object.Equals()方法:

如果實現IEquatable,你也應該覆蓋的Object.Equals(對象)和GetHashCode的基礎 類實現,這樣 他們的行爲與該IEquatable一致。等於 方法。如果您重寫Object.Equals(Object),則在調用類的靜態方法 Equals(System.Object,System.Object)時,也會調用您的重寫的 實現。在 另外,您應該重載op_Equality和op_Inequality 運算符。這確保了所有相等的測試返回一致的 結果。

+0

謝謝。只有一個問題。重寫GetHashCode()時我會返回什麼? Id.GetHashCode()? – MrProgram

+1

重寫GetHashCode是另一個不是簡單的問題。對於只有一個屬性的類型,您可以僅返回Id.GetHashCode。另請參閱此問題和有關它的答案:http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode –

1

另一個指針到您的解決方案可以在這裏找到 - 這說明了什麼都是你的選擇 - please have a read

通常情況下,你實現當 預期類型的​​對象被添加到值相等某種類型的集合,或者其主要用途是存儲一組字段或屬性。您可以使用 將所有 字段和屬性的類型中的值相等的定義基於比較,也可以將定義基於 子集。