首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Effective C# 原則 10:瞭解 GetHashCode() 的缺陷(二)

     編輯:關於C語言

三大規則詳細解析

規則 1:相等物件必須有相同雜湊碼

  • 實值型別預設 == 比較第一個欄位 → 滿足規則 1
  • 若覆寫 == 不用第一欄位 → 破壞規則 1

規則 2:雜湊碼必須不可變

  • ValueType.GetHashCode() 使用第一個欄位
  • 第一欄位若為 readonly → 滿足規則 2
  • 第一欄位可變 → 破壞規則 2(另一個理由用 readonly struct)

規則 3:雜湊分布均勻

取決於第一欄位的值域分布。若第一欄位經常相同(如 DateTime _epoch 只存日期),所有同一天建立的物件雜湊碼相同 → 衝突嚴重、效能劣化。

預設行為總結

型別預設 GetHashCode()正確性效能
參考型別物件 ID正確(除非覆寫 ==)差(分布集中)
實值型別第一欄位雜湊碼僅當第一欄位不可變且分布佳視第一欄位而定

自訂 GetHashCode() 實作前置條件

  1. 參與雜湊的欄位 = 參與 Equals 比較的欄位
  2. 所有參與欄位必須不可變(readonly)
  3. 型別設計為不可變

Customer 類別反面教材

public class Customer
{
    public string Name { get; set; } // 可變!
    public override int GetHashCode() => Name.GetHashCode(); // 危險!
}

修改 Name 後雜湊碼改變,導致雜湊表找不到該物件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved