[英]How do I override GetHashCode in a general BaseClass
互聯網上有很多有關重寫Equals時如何重寫GetHashCode()的信息。 但是,所有這些示例都是關於包含一些可以生成哈希值的字段的類的。 我想找到的是一個良好的GetHashCode實現,該實現適用於我用於所有業務邏輯層對象的基類。 稱為BusinessLogica的此類包含ToString()實現,我的框架的一些基本功能以及以下Equals覆蓋:
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類中都覆蓋它?
由於只使用ID
屬性測試是否相等,因此幾乎肯定也應該使用該屬性來導出哈希碼。
如果ID
是Int32
則this.ID
從GetHashCode
方法返回this.ID
如果ID
是其他類型,則可以返回this.ID.GetHashCode()
。
我認為一般的想法是-如果您重新定義了equals,則以下不變式必須成立
2個相等的對象必須具有相同的哈希碼。 (反之亦然)。
另請參見此問題的實現- 為什么在重寫Equals方法時重寫GetHashCode很重要? 。 但是,在您的示例中,我認為您可以僅使用ID屬性生成哈希碼。
假設:它支持上述不變式。 同樣,它是不可變的,一旦創建了對象,則ID不應更改。
Equals(...)
和GetHashCode(...)
應該始終等效實現。
如果確定對象與它們的ID
相等(盡管這值得商bat),則還應該返回ID
的HashCode。
由於您使用ID來確定對象是否相等,因此您的GetHashCode
實現也應該使用ID:
public override int GetHashCode()
{
return this.ID.GetHashCode();
}
編寫Equals
和GetHashCode
方法時要記住的最重要的事情是,您永遠都不應沒有另一個,並且彼此同意。 因此,在這種情況下,返回ID
作為哈希碼(或ID
相同的哈希碼)完全可以。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.