Sorunun Tarihi:
VB.NET'te anahtar-değer için ilişkilendirilmiş veri depolamanın öne çıkan standardı Dictionary(Of TKey, TValue) sınıfıdır. Klasik VB6'da genellikle Scripting.Dictionary nesnesi veya Collection koleksiyonu ve erken .NET sürümlerinde ortaya çıkan Hashtable türü kullanıldı. Bu yapılar, anahtara göre değerleri hızlı bir şekilde bulmayı sağlamaktadır ve daha az tür güvenli yaklaşımların yerini almıştır.
Sorun
Dictionary ile Hashtable arasındaki belirgin farklar — ve mevcut olmayan bir anahtar üzerinde arama yaparken karşılaşılabilecek hatalar. Örneğin, mevcut olmayan bir anahtara erişim denemesi bazı durumlarda hata verirken, bazılarında vermez. Tür güvenliği ve performanstaki farklılıklar da koleksiyonun yanlış seçimine yol açmaktadır.
Çözüm
Modern VB.NET sürümlerinde en iyi uygulama, TKey ve TValue'nin katı bir şekilde türlendirilmiş olduğu Dictionary(Of TKey, TValue) kullanımını gerektirir:
Dim dict As New Dictionary(Of String, Integer)() dict.Add("apple", 1) dict.Add("banana", 2) If dict.ContainsKey("banana") Then Console.WriteLine(dict("banana")) ' 2 yazdıracaktır End If ' Güvenli bir şekilde değer al Dim value As Integer If dict.TryGetValue("cherry", value) Then Console.WriteLine(value) Else Console.WriteLine("Böyle bir anahtar yok!") End If
Anahtar özellikler:
Anahtar olarak Object kullanabilir miyim?
Formal olarak evet, ancak anahtar olarak kullanılan sınıfın GetHashCode ve Equals yöntemlerinin doğru bir şekilde uygulanması gerekir. Aksi halde çakışmalar ve arama hataları mümkün olabilir.
dict("foo") ile mevcut olmayan bir anahtara erişim olursa ne olur?
KeyNotFoundException istisnası fırlatılır. Anahtarı önceden kontrol etmeden (ContainsKey veya TryGetValue ile) program çöker.
Dictionary ve Hashtable aynı şekilde eleman sıralamasını destekler mi?
Hayır. Her iki sınıf da elemanların eklenme sırasını garanti etmez. Sıralamayı korumak için SortedDictionary, OrderedDictionary veya diğer yapıları kullanın.
Geliştirici, büyük miktarda kullanıcı verisini depolamak için Hashtable kullandı. Aynı anahtar her zaman eşleşmediği için zor yakalanan hatalar meydana geldi, testlerde Object.ReferenceEquals hataları ortaya çıktı, kararsız bir anahtar türü kullanıldı.
Artılar:
Eksiler:
Dictionary(Of Guid, User) üzerine geçildi: katı türlendirme, TryGetValue desteği, çakışma hataları ortadan kaldırıldı. Performans arttı.
Artılar:
Eksiler: