ProgramlamaVB.NET geliştiricisi

Visual Basic'de For ve For Each döngüleri nasıl gerçekleştirilir, hangi durumlarda hangi döngünün seçileceği ve koleksiyonlarla çalışırken sıkça karşılaşılan hatalar nelerdir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Visual Basic'te belirli görevler için kullanılan For ve For Each döngüleri bulunmaktadır.

Konunun Tarihi

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ı.

Sorun

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.

Çözüm

Aşağıdaki durumlarda normal For kullanın:

  • Elemanın indeksine ihtiyacınız varsa
  • Dizi elemanlarını indeks üzerinden değiştirmek istiyorsanız
  • Sayı aralığında yineleme gerekiyorsa

Aşağıdaki durumlarda For Each kullanın:

  • Her elemanın değeri önem taşıyorsa
  • Koleksiyon yapısı önceden bilinmiyorsa
  • Zarafet ve hata minimizasyonu gerekiyorsa

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:

  • For, indekslerle çalışmak için kullanılır
  • For Each ile döngü içinde koleksiyonu değiştirmek mümkün değildir
  • For Each, herhangi bir IEnumerable nesnesi için evrenseldir

Aldatıcı Sorular.

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.

Yaygın Hatalar ve Anti-Desenler

  • For Each sırasında koleksiyonu değiştirmek
  • Bireysel For ile diziler ve koleksiyonlar kullanırken indeksleri karıştırmak
  • Elemanın indeksine ihtiyaç varsa For Each kullanmak

Gerçek Hayattan Bir Örnek

** 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ı:

  • Koleksiyonu okuma için basit kod

Eksileri:

  • Program aniden duruyor

** 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ı:

  • Yineleme hatası yok, tüm gerekli elemanlar siliniyor

Eksileri:

  • Daha fazla kod gerektiriyor ve veri yapısını anlama bilgisi gerekiyor