ProgrammierungVB.NET Entwickler, Backend Entwickler

Wie funktionieren For Each-Schleifen in Visual Basic? Was sind die Unterschiede zu For und While, welche Objekte können auf diese Weise durchlaufen werden und welche Fallen entstehen, wenn die Sammlung in der Schleife geändert wird?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

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:

  • Es ist nicht möglich, Elemente der Sammlung direkt zu ändern (insbesondere wenn die Sammlung unveränderlich oder strukturell ist).
  • Die Sammlung muss das IEnumerable-Interface implementieren.
  • Bei Änderungen an der Sammlung (Hinzufügen/Entfernen von Elementen) während der Schleife kann eine InvalidOperationException auftreten.

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

Fangfrage

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

Beispiele für reale Fehler aufgrund von Unkenntnis der Feinheiten des Themas


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.