Sorunun Tarihi
.NET Framework'ün ortaya çıkmasıyla birlikte, Visual Basic anahtar-değer çiftlerini saklamak için tip güvenli ve hızlı bir yapı olan Dictionary(Of TKey, TValue) aldı. Bu, hızlı arama için standart bir ilişkilendirilmiş konteynerdir.
Problem
Sözlükle çalışırken sık sık hatalar oluşur: var olmayan bir anahtarı kullanarak bir değere erişmeye çalışmak bir istisnaya yol açar. Ayrıca, ekleme, değiştirme ve yeni değer ekleme işlemleri sıklıkla karıştırılır.
Çözüm
Değerlere erişmek için indeksleyici veya TryGetValue, ContainsKey yöntemleri kullanılır. KeyNotFoundException istisnasını önlemek için her zaman açık bir kontrol yapın:
Kod örneği:
Dim dict As New Dictionary(Of String, Integer)() dict.Add("bir", 1) dict("iki") = 2 ' Yeni bir çift ekleme If dict.ContainsKey("üç") Then Console.WriteLine(dict("üç")) ' Hata vermeyecek Else Console.WriteLine("Anahtar bulunamadı") End If Dim value As Integer = 0 If dict.TryGetValue("bir", value) Then Console.WriteLine(value) End If
Anahtar Özellikler:
dict("anahtar") her zaman yeni bir anahtar-değer çifti ekler mi?
Hayır. Eğer anahtar mevcutsa, değer güncellenir. Eğer mevcut değilse, çift eklenir. Mevcut bir anahtar için hata ile eklemek istiyorsanız, Add kullanın.
Eğer anahtar yoksa TryGetValue bir istisna fırlatacak mı?
Hayır. False döndürecektir, istisna fırlatmadan ve değeri değiştirmeden. Bu, güvenli bir erişim yöntemidir.
Dictionary'de değer türlerinin (örneğin, Integer) TValue olarak saklanması ve var olmayan bir anahtar için null alınabilir mi?
Hayır. Değer türü için varsayılan değer (Integer için 0) döner, ancak indeksleyici yoluyla erişim hala anahtarın yokluğunda bir istisna fırlatır.
İndeksleyici ile ön kontrol olmadan sözlüğe erişim farklı yerlerde tekrar ediyor — programın aralıklı çökmesi.
Artılar:
Eksiler:
TryGetValue'nin yaygın kullanımı, tüm erişimler korunmuş, anahtar yokluğu durumları mantıksal olarak işlenmektedir.
Artılar:
Eksiler: