簡體   English   中英

C#用戶類。 GetHashCode實現

[英]C# User class. GetHashCode implementation

我只有公共字符串屬性的簡單類。

public class SimpleClass
{
    public string Field1 {get; set;}
    public string Field2 {get; set;}
    public string Field3 {get; set;}
    public List<SimpleClass> Children {get; set;}

    public bool Equals(SimpleClass simple)
    {
        if (simple == null)
        {
            return false;
        }
        return IsFieldsAreEquals(simple) && IsChildrenAreEquals(simple);
    }

    public override int GetHashCode()
    {
        return RuntimeHelpers.GetHashCode(this); //Bad idea!
    }
}

對於相等的實例,此代碼不會返回相同的值。 但是此類沒有用於計算哈希的只讀字段。

如果我所有的屬性都是可變的,我該如何在GetHashCode()生成正確的哈希。

GetHashCode合同要求(強調我的):

只要沒有修改確定對象的Equals方法返回值的對象狀態,對象的GetHashCode方法就必須始終返回相同的哈希碼。

因此,基本上,您應該根據Equals所有使用的字段進行計算,即使它們是可變的。 但是,文檔還指出:

如果確實選擇為可變的引用類型覆蓋GetHashCode ,則文檔應明確說明,當對象存儲在哈希表中時,該類型的用戶不應修改對象值。

如果只有部分屬性是可變的,則可以覆蓋GetHashCode以僅基於不可變的屬性進行計算-但是在這種情況下, 所有內容都是可變的,因此您最終將返回一個常量,使它變得難以處理基於哈希的集合。

因此,我建議以下三個選項之一:

  • 使用可變字段,並仔細記錄下來。
  • 放棄覆蓋平等/哈希操作
  • 放棄它的可變性

暫無
暫無

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

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