Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Tại sao Dictionary ưu tiên hơn Hashtable trong C#?

Dictionary<TKey, TValue> (trong System.Collections.Generic) được ưu tiên hơn Hashtable (trong System.Collections) trong hầu hết các trường hợp hiện đại do hiệu suất, type safety và API tốt hơn.

So sánh chính

Đặc điểmHashtableDictionary<TKey, TValue>
KiểuNon-generic (object/object)Generic (strongly-typed)
Boxing/UnboxingCó (value type → object)Không (type-safe)
Hiệu suấtChậm hơn do boxingNhanh hơn đáng kể
Key nullCho phépKhông cho phép (ném ArgumentNullException)
Thread safetyHashtable.Synchronized()Không thread-safe (dùng ConcurrentDictionary)
Duyệt thứ tựKhông đảm bảoKhông đảm bảo (dùng SortedDictionary nếu cần)

Ví dụ so sánh ContainsKey

// Hashtable - boxing cho key int
Hashtable hashtable = new Hashtable();
hashtable[12345] = "value";
bool h = hashtable.ContainsKey("12345");  // Boxing, chậm

// Dictionary - type safe, không boxing
Dictionary dictionary = new Dictionary();
dictionary[12345] = "value";
bool d = dictionary.ContainsKey(12345);   // Nhanh, type-safe

Khi nào vẫn dùng Hashtable?

  • Tương thích ngược (.NET Framework 1.0/1.1 legacy code)
  • Cần key là null
  • Cần thread-safe đơn giản (Hashtable.Synchronized) - nhưng khuyến khích ConcurrentDictionary
  • Serialization binary cũ

Best Practice hiện đại

// ✅ Khuyến khích
var dict = new Dictionary();
dict[1] = "one";

// ✅ Thread-safe
var concurrentDict = new ConcurrentDictionary();

// ✅ Sắp xếp theo key
var sortedDict = new SortedDictionary();

// ❌ Tránh trong code mới
var hashtable = new Hashtable();

Kết luận

Dictionary nhanh hơn, an toàn kiểu (type-safe), tránh boxing/unboxing, API hiện đại hơn. Chỉ dùng Hashtable khi bảo trì code cũ.