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

Hashtable 遷移至 Dictionary 完全指南:成員對應、缺失功能補齊與最佳實踐

     編輯:關於C語言

前言

.NET 2.0 引入 Dictionary<TKey, TValue> 取代非泛型 Hashtable,帶來型別安全、效能提升(避免裝箱/拆箱)、語意清晰等優勢。但兩者 API 不完全對等,遷移時需處理成員差異、缺失功能補齊。本文提供完整對照表與程式碼範例,助你無痛遷移。

核心成員對照表

Hashtable 成員Dictionary 對應成員備註
CountCount完全相同
KeysKeys回傳 ICollection<TKey> vs ICollection
ValuesValues回傳 ICollection<TValue> vs ICollection
Item[key]Item[key]型別安全,無需轉型
AddAdd參數型別強類型
ClearClear相同
Contains(key)ContainsKey(key)Hashtable 的 Contains 等同 ContainsKey
ContainsKeyContainsKey相同
ContainsValueContainsValue相同
RemoveRemove相同
Clone建構子 new Dictionary(dict)Dictionary 未實作 ICloneable
CopyTo(Array, index)((ICollection)dict).CopyTo(arr, index)需轉型為 ICollection
IsFixedSize((IDictionary)dict).IsFixedSize需轉型為 IDictionary
IsReadOnly((IDictionary)dict).IsReadOnly需轉型為 IDictionary
IsSynchronized((IDictionary)dict).IsSynchronized永遠回傳 false
SyncRoot((IDictionary)dict).SyncRoot回傳 this,建議改用 lock
Synchronized()無對應改用 lock(dict.SyncRoot) 或專用同步物件
-TryGetValueDictionary 獨有,高效鍵值原子讀取
-ComparerDictionary 獨有,取得比較器

缺失功能補齊程式碼範例

1. 取得 Hashtable 專有屬性(IsReadOnly 等)

var numbers = new Dictionary<int, string>();
Console.WriteLine(((IDictionary)numbers).IsReadOnly);
Console.WriteLine(((IDictionary)numbers).IsFixedSize);
Console.WriteLine(((IDictionary)numbers).IsSynchronized); // 永遠 false
Console.WriteLine(((IDictionary)numbers).SyncRoot);      // 回傳 this

注意:IsSynchronized 永遠為 false,Microsoft 移除了泛型集合的同步包裝功能,建議改用 lock 手動同步。

2. 複製字典(替代 Clone)

var numbers = new Dictionary<int, string> { {1, "one"}, {2, "two"} };
var clonedNumbers = new Dictionary<int, string>(numbers); // 建構子複製

3. 模擬 Hashtable.Contains(等同 ContainsKey)

bool exists = numbers.ContainsKey(1); // 直接使用

4. 模擬 CopyTo(需轉型 ICollection)

var objs = new KeyValuePair<int, string>[numbers.Count];
((ICollection)numbers).CopyTo(objs, 0);

foreach (var kvp in objs)
    Console.WriteLine($"Key: {kvp.Key}\tValue: {kvp.Value}");

關鍵點:建立 KeyValuePair<TKey, TValue>[] 陣列,轉型 ICollection 呼叫 CopyTo。

遷移最佳實踐清單

  1. 全域搜尋替換:Hashtable → Dictionary<TKey, TValue>,補齊型別參數。
  2. 修正列舉變數型別:DictionaryEntry → KeyValuePair<TKey, TValue>。
  3. 移除轉型碼:鍵值存取不再需要 (int)de.Key 等轉型。
  4. 替換 Clone:改用建構子複製或 ToDictionary() (LINQ)。
  5. 補上同步邏輯:若原用 Hashtable.Synchronized,改用 lock(_syncObj) 包裝操作。
  6. 善用 TryGetValue:替代 ContainsKey + Item[key] 兩次查找。
  7. 檢查序列化:Dictionary 可序列化,但自訂比較器需標記 [Serializable]。

效能對比提醒

  • 值型別鍵:Dictionary<int, T> 完全避免裝箱,效能碾壓 Hashtable。
  • 參考型別鍵:差距縮小,但 Dictionary 仍具型別安全優勢。
  • 記憶體:Dictionary 結構更緊湊(無 DictionaryEntry 物件)。

總結

Hashtable 到 Dictionary 的遷移是 .NET 現代化的必經之路。掌握成員對照表、補齊缺失功能、建立遷移檢查清單,即可安全、高效完成遷移。新專案請直接使用 Dictionary<TKey, TValue> 或 ConcurrentDictionary(多執行緒場景),勿再使用 Hashtable。

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