2010-07-26 75 views
2

因特網上有很多關於如何在Equals被覆蓋時覆蓋GetHashCode()的信息。但是,所有這些例子都是關於包含幾個可以生成散列的字段的類。 我試圖找到的是我用於所有業務邏輯層對象的基類的一個很好的GetHashCode實現。這個類,稱爲BusinessLogica,包含一個toString()實現,爲我的框架,一些基本的功能和以下的Equals重寫:如何覆蓋通用BaseClass中的GetHashCode

public override bool Equals(object obj) 
    { 
     bool retValue; 

     if (obj is BusinessLogica && this.GetType() == obj.GetType()) 
     { 
      retValue = this.ID == ((BusinessLogica)obj).ID; 
     } 
     else 
     { 
      retValue = false; 
     } 

     return retValue; 
    } 

現在,我做了什麼,到目前爲止是當我需要擴展此對象BusinessLogica和我用作字典中的鍵的重寫,我在此特定類中重寫GetHashCode並返回ID。 我也可以在BusinessLogica基類中使用此實現。這是'安全'嗎?我還看到了返回ToString(),GetHashCode()的例子。

什麼是明智的使用?或者是這個級別的GetHashCode不可用,我是否應該在每個BusinessLogica類中覆蓋它?

回答

2

既然你只使用ID屬性來測試相等性,那麼這幾乎可以肯定你應該用它來派生你的散列碼。

如果IDInt32那麼從GetHashCode方法返回this.ID應該沒問題。如果ID是某種其他類型,那麼您可以返回this.ID.GetHashCode()

2

我覺得一般的想法是 - 如果你重新定義了等號,那麼下面不變,必須持有

2相等的對象必須具有相同的哈希碼。 (其他方式可能並非如此)。

另請參閱此問題的實施 - Why is it important to override GetHashCode when Equals method is overridden?。在你的例子中,不過我認爲你可以使用ID屬性來生成hashcode。

假設:它支持上述不變量。它也是不可變的,一旦創建了一個對象,該ID不應該改變。

0

Equals(...)GetHashCode(...)應始終等效實施。

如果你確定你的對象是相等的ID(雖然這是有爭議的),那麼你也應該返回ID的HashCode。

0

由於您使用的ID,以確定是否對象是相等的GetHashCode實現應該使用ID太:

public override int GetHashCode() 
{ 
    return this.ID.GetHashCode(); 
} 
0

,最重要的是要永遠記住寫一個EqualsGetHashCode方法時是,你不應該有一個沒有另一個,他們同意彼此。所以在這種情況下,返回ID作爲哈希碼(或者是相同的哈希碼ID)是完全正確的。