Il ciclo For Each in Visual Basic è progettato per iterare in sequenza su tutti gli elementi di una collezione o di un array. Il suo utilizzo semplifica il lavoro con oggetti enumerabili (Collection, Array, liste, ecc.), senza richiedere un accesso esplicito agli indici.
Sintassi:
For Each element As DataType In collection ' Azioni su element Next
Differenze rispetto ad altri cicli:
For — richiede di specificare un contatore e un intervallo, è utile quando è necessario accedere agli elementi per indice.While — viene eseguito finché la condizione è vera, adatto per quantità imprevedibili di iterazioni.For Each — itera su tutti gli elementi senza accesso agli indici, adatto per collezioni moderne.Limitazioni e caratteristiche di For Each:
Esempio:
Dim items As New List(Of Integer)({1, 2, 3}) For Each item As Integer In items Console.WriteLine(item) Next
Tentare di modificare la collezione all'interno del ciclo potrebbe generare un errore:
For Each item As Integer In items If item = 2 Then items.Remove(item) ' Eccezione! End If Next
È possibile modificare gli elementi della collezione per valore, utilizzando For Each, se gli elementi sono strutture?
No, se gli elementi della collezione sono strutture (tipi valore), allora la variabile iteratore in For Each contiene una copia del valore. Qualsiasi modifica della variabile non influenzerà l'elemento reale della collezione. Ad esempio:
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 ' Non modifica points(0).X Next
Storia
Nel progetto è stato utilizzato For Each per modificare i campi delle strutture degli impiegati. L'iterazione non ha modificato i dati originali, poiché l'oggetto iteratore era una copia e non l'elemento stesso della collezione. Di conseguenza, l'aggiornamento degli stipendi non ha avuto effetto.
Storia
Durante l'iterazione di un elenco in For Each, all'interno di una condizione venivano rimossi elementi — di conseguenza, l'applicazione lanciava InvalidOperationException e terminava in modo anomalo.
Storia
L'iterazione della collezione tramite For Each senza considerare la sua mutabilità ha portato a un ciclo infinito, quando una fonte dati esterna riempiva contemporaneamente questa collezione mentre veniva letta, causando logiche errate nei calcoli.