Visual Basic'te koleksiyonlar (diziler, listeler, sözlükler vb.) hem indeks ile erişimi hem de yineleyicilerle erişimi (örneğin, For Each ile) destekler. Dilin tarihindeki standart dizinin ilk elemanı 0 ile indekslenmiştir, ancak VB6 ile uyumluluk nedeniyle 1 ile bildirilen diziler de bulunmaktadır. Bu, erişim sırasını ve olası hataları etkiler. Ayrıca, Dictionary türündeki koleksiyonlar anahtara göre arama yapar, ancak mevcut olmayan bir elemana erişim denemesi istisna fırlatabilir.
Erişim sorunları, sözdizimi farklılıkları, indeksleyici ile çalışma özellikleri ve bazı koleksiyonların eleman olmadığında Null veya Nothing döndürmemesi — genellikle bir istisna ile karşılaşılması — gibi durumlarla ilgilidir. Döngüler kullanırken, indeks aralığını kontrol etmek ve koleksiyonun boyutunu önceden kontrol etmek önemlidir.
Güvenli erişim çözümü, uzunluğu kontrol etmeyi, sözlükler için ContainsKey veya TryGetValue metodlarını kullanmayı ve For Each ile öğeleri listeleyerek mevcut değerlere erişimi içerir, bu da sınırların dışına çıkma riskini ortadan kaldırır.
Kod örneği:
Dim list As New List(Of String)({"a", "b", "c"}) For i As Integer = 0 To list.Count - 1 Console.WriteLine(list(i)) Next ' İteratör ile yineleme: For Each item In list Console.WriteLine(item) Next ' Dictionary'de güvenli erişim Dim dict As New Dictionary(Of Integer, String) dict(1) = "bir" If dict.ContainsKey(2) Then Console.WriteLine(dict(2)) End If
Anahtar özellikler:
Dictionary'e, dizi gibi indeks ile erişilebilir mi?
Hayır, Dictionary sayısal indeks ile erişimi desteklemez, yalnızca anahtara göre erişir. Anahtarları sıralı geçmek için anahtarların koleksiyonunu almak gerekir:
For Each key In dict.Keys Console.WriteLine(dict(key)) Next
List'e indeks dışında başvurursanız ne olur?
ArgumentOutOfRangeException istisnası fırlatılır. Her zaman indeksin Count'tan küçük ve 0 veya daha büyük olduğunu kontrol edin.
For Each, koleksiyon yineleme sırasında değiştirilirse elemanları atlayabilir mi?
Evet, For Each içinde koleksiyonu değiştirmek InvalidOperationException istisnasına yol açar. İterasyon sırasında eleman ekleme veya silmekten kaçının:
' Hata örneği For Each x In list list.Remove(x) ' İstisna fırlatır Next
Yeni başlayanlar, For Each döngüsü içinde List'e eleman ekliyordu, sonuçta uygulama InvalidOperationException hatasıyla çöktü.
Avantajlar:
Yinelemeye başlamadan önce elemanların listesini ayrı bir diziye kaydetmek, kopyayla çalışmak veya indeks ile For kullanmak. Dictionary'ye erişim, anahtarın varlığı kontrol edildikten sonra yapılmalıdır.
Avantajlar: