Visual Basic'de For Each döngüsü, bir koleksiyon veya dizinin tüm elemanlarını sıralı bir şekilde döngülemek için tasarlanmıştır. Kullanımı, listeleme nesneleri (Collection, Array, listeler vb.) ile çalışmayı kolaylaştırır ve açıkça indekslere erişim gerektirmez.
Sözdizimi:
For Each element As DataType In collection ' element ile işlemler Next
Diğer döngülerden farkları:
For — bir sayıcı ve aralık belirtmeyi gerektirir, indeksle erişim gerektiğinde etkilidir.While — koşul doğru olduğu sürece çalışır, tahmin edilemeyen tekrar sayıları için uygundur.For Each — indekslere erişim olmadan tüm elemanlar üzerinde döner, modern koleksiyonlar için uygundur.For Each'in sınırlamaları ve özellikleri:
Örnek:
Dim items As New List(Of Integer)({1, 2, 3}) For Each item As Integer In items Console.WriteLine(item) Next
Döngü içinde koleksiyonu değiştirme girişimi hata verebilir:
For Each item As Integer In items If item = 2 Then items.Remove(item) ' Hata! End If Next
Elementleri değer olarak değiştirerek For Each ile değiştirebilir miyiz, eğer elemanlar yapılar ise?
Hayır, eğer koleksiyon elemanları yapılar (value types) ise, For Each'deki döngü değişkeni değerinin bir kopyasını içerir. Değişken üzerindeki herhangi bir değişiklik, koleksiyonun gerçek elemanını etkilemez. Örneğin:
Structure Point Public X As Integer End Structure Dim points As New List(Of Point)({New Point With {.X = 1}}) For Each pt In points pt.X = 100 ' points(0).X'i değiştirmez Next
Hikaye
Proje, çalışan yapılarının alanlarını değiştirmek için For Each kullanıyordu. İterasyon, döngü değişkeninin bir kopyası olduğu için varsayılan verileri değiştirmedi. Bu nedenle maaş güncellemeleri çalışmadı.
Hikaye
For Each listesi dönerken koşul içinde elemanlar kaldırılıyordu — sonuç olarak uygulama InvalidOperationException hatası vererek duruyordu.
Hikaye
Değiştirilebilirlik göz önüne alınmadan For Each ile koleksiyonu döngülemek, dış veri kaynağı bu koleksiyonu aynı anda doldurduğunda sonsuz bir döngüye neden oldu ve hesaplamalarda mantıksal hatalara yol açtı.