Die For Each-Schleife in Visual Basic wird verwendet, um alle Elemente einer Sammlung oder eines Arrays sequenziell zu durchlaufen. Ihre Verwendung vereinfacht die Arbeit mit enumerierbaren Objekten (Collection, Array, Listen usw.`) und erfordert keinen direkten Zugriff auf Indizes.
Syntax:
For Each element As DataType In collection ' Aktionen mit element Next
Unterschiede zu anderen Schleifen:
For — erfordert die Angabe eines Zählers und eines Bereichs, ist effektiv, wenn der Zugriff auf die Elemente über Indizes erforderlich ist.While — wird ausgeführt, solange die Bedingung wahr ist, eignet sich für unvorhersehbare Mengen an Iterationen.For Each — iteriert über alle Elemente ohne Zugriff auf Indizes, geeignet für moderne Sammlungen.Einschränkungen und Besonderheiten von For Each:
Beispiel:
Dim items As New List(Of Integer)({1, 2, 3}) For Each item As Integer In items Console.WriteLine(item) Next
Ein Versuch, die Sammlung innerhalb der Schleife zu ändern, kann einen Fehler verursachen:
For Each item As Integer In items If item = 2 Then items.Remove(item) ' Ausnahme! End If Next
Kann man Elemente der Sammlung nach Wert ändern, indem man For Each verwendet, wenn die Elemente Strukturen sind?
Nein, wenn die Elemente der Sammlung Strukturen (Werttypen) sind, enthält die Iterationsvariable in For Each eine Kopie des Wertes. Jede Änderung der Variablen betrifft nicht das tatsächliche Element der Sammlung. Zum Beispiel:
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 'ändert nicht points(0).X Next
Geschichte
Im Projekt wurde For Each verwendet, um die Felder von Mitarbeiterstrukturen zu ändern. Die Iteration änderte die ursprünglichen Daten nicht, da das Iterationsobjekt eine Kopie und nicht das tatsächliche Element der Sammlung war. Dadurch wurde die Gehaltsanpassung nicht wirksam.
Geschichte
Beim Durchlaufen einer Liste in For Each wurden innerhalb einer Bedingung Elemente entfernt – in der Folge warf die Anwendung eine InvalidOperationException und wurde unerwartet beendet.
Geschichte
Das Durchlaufen der Sammlung über For Each ohne Berücksichtigung ihrer Änderbarkeit führte zu einer Endlosschleife, als eine externe Datenquelle diese Sammlung gleichzeitig mit dem Lesen befüllte, was zu logischen Fehlern in den Berechnungen führte.