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ểm | Hashtable | Dictionary<TKey, TValue> |
|---|---|---|
| Kiểu | Non-generic (object/object) | Generic (strongly-typed) |
| Boxing/Unboxing | Có (value type → object) | Không (type-safe) |
| Hiệu suất | Chậm hơn do boxing | Nhanh hơn đáng kể |
| Key null | Cho phép | Không cho phép (ném ArgumentNullException) |
| Thread safety | Hashtable.Synchronized() | Không thread-safe (dùng ConcurrentDictionary) |
| Duyệt thứ tự | Không đảm bảo | Khô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íchConcurrentDictionary - 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ũ.