在.NET中,您需要Equals(object)和GetHashCode()是兼容的。但有時不能:當空間大於32位時,如何實現兼容GetHashCode的Equals方法?
public class GreaterThan32Bits
{
public int X { get; set; }
public int Y { get; set; }
}
因爲數據密度大於32位,和GetHashCode返回一個Int32,你將有3個解決方案(假設正確實現的GetHashCode):
避免代碼重複丟棄不正確public override bool Equals(object other) { if(ReferenceEquals(null, other)) return false; if(ReferenceEquals(this, other)) return true; return this.GetHashCode() == other.GetHashCode(); }
實現從GetHashCode()方法
public override bool Equals(object obj) { if(ReferenceEquals(null, other)) return false; if(ReferenceEquals(this, other)) return true; var other = obj as GreaterThan32Bits; if(this.X == other.X) return this.Y == other.Y; return false; }
單獨的Equals實現一個更大的精度GetHashCode64,所述overrided GetHashCode的(32個比特)將返回(INT)GetHashCode64(),並且等於將返回this.GetHashCode64()==其它.GetHashCode64()
你會實現哪一個?
第一種解決方案是
不精確
不正確,但更乾淨。第二個選項似乎很乾淨,但當類有更多屬性時會變得非常複雜。第三個選擇是妥協。
重新閱讀您的問題:我認爲您應該保持GetHashCode和Equals方法分開。 GetHashCode()應該完全做到這一點:生成一個哈希碼。等於應該比較兩個對象的平等。 – 2009-07-20 23:21:34
+1用於回答此問題的評論 – 2009-07-20 23:31:30