ProgrammazioneSviluppatore VB.NET, Sviluppatore Backend

Come funzionano i cicli For Each in Visual Basic? Quali sono le differenze rispetto a For e While, quali oggetti possono essere iterati in questo modo e quali trappole si presentano quando si modifica la collezione all'interno del ciclo?

Supera i colloqui con l'assistente IA Hintsage

Risposta

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:

  • Non è possibile modificare direttamente gli elementi della collezione (soprattutto se la collezione è immutabile o strutturale).
  • La collezione deve implementare l'interfaccia IEnumerable.
  • Durante la modifica della collezione (aggiunta/rimozione di elementi) durante il ciclo può verificarsi un'eccezione InvalidOperationException.

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

Domanda trabocchetto

È 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

Esempi di errori reali causati dalla mancanza di conoscenze sui dettagli dell'argomento


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.