簡體   English   中英

如何在常規BaseClass中重寫GetHashCode

[英]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屬性測試是否相等,因此幾乎肯定也應該使用該屬性來導出哈希碼。

如果IDInt32this.IDGetHashCode方法返回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();
}

編寫EqualsGetHashCode方法時要記住的最重要的事情是,您永遠都不應沒有另一個,並且彼此同意。 因此,在這種情況下,返回ID作為哈希碼(或ID相同的哈希碼)完全可以。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM