ProgramlamaVB.NET geliştirici, Backend geliştirici

Visual Basic'de For Each döngüleri nasıl çalışır? For ve While'dan farkları nelerdir, bu şekilde hangi nesneleri döngüleyebiliriz ve döngü sırasında koleksiyonu değiştirdiğimizde hangi tuzaklar ortaya çıkar?

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

Cevap

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:

  • Koleksiyondaki elemanları doğrudan değiştirmek mümkün değildir (özellikle koleksiyon değiştirilemez veya yapısal ise).
  • Koleksiyon, IEnumerable arayüzünü uygulamalıdır.
  • Döngü sırasında koleksiyonu değiştirmek (eleman eklemek/çıkarmak) InvalidOperationException hatasına neden olabilir.

Ö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

Kandırmaca Sorusu

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

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri


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