Visual Basic'te belirli görevler için kullanılan For ve For Each döngüleri bulunmaktadır.
VB6 ve klasik Visual Basic yalnızca aralık döngülerine (For ... Next) destekliyordu. Sonraki sürümlerde (VB6 ve VB.NET'ten itibaren) koleksiyon ve dizilerin elemanlarını zarif bir şekilde döngüye almak için For Each ortaya çıktı.
Ana sorun, döngü türünün yanlış seçimi ve For Each içerisinde koleksiyonu değiştirme girişimi olup, bu durum çalışma zamanı hatalarına yol açar.
Aşağıdaki durumlarda normal For kullanın:
Aşağıdaki durumlarda For Each kullanın:
Kod örneği:
' Değişiklikle elemanları döngüye alma Dim arr() As Integer = {1, 2, 3} For i As Integer = 0 To arr.Length - 1 arr(i) = arr(i) * 2 Next ' Koleksiyonu yalnızca okuma Dim list As New List(Of String) From {"bir", "iki", "üç"} For Each s As String In list Console.WriteLine(s) Next
Anahtar özellikler:
List(Of T) koleksiyonunu For Each içinde değiştirmek mümkün mü?
Hayır. Bu, koleksiyon yapısının yineleme sırasında değişmemesi gerektiğinden InvalidOperationException hatasına yol açar.
For Each'ten erken çıkmanın doğru yolu nedir?
Gerekli eleman bulunduğunda Exit For komutunu kullanın.
For Each s In list If s = "iki" Then Exit For End If Next
Diziler için For ile For Each arasındaki hız farkı nedir?
Genellikle fark minimumdur, ancak For biraz daha hızlı olabilir (özellikle ilkel tiplerdeki diziler için), çünkü indekslerle doğrudan çalışır; For Each ise ek bir enumerator nesnesi üretir.
** Olumsuz Durum
Yazılımcı For Each sırasında List(Of T) içinden elemanları silmeye çalışıyor. Çalışma sırasında InvalidOperationException hatası alıyor.
Artıları:
Eksileri:
** Pozitif Durum
Elemanların silinmesi için normal For ile geri doğru döngü gerçekleştiriliyor:
For i = list.Count - 1 To 0 Step -1 If list(i) = "iki" Then list.RemoveAt(i) End If Next
Artıları:
Eksileri: