0Pricing
C# Academy · Lezione

Errori comuni nell'iterazione

Modificare una collezione durante l'iterazione.

Errori comuni nell'iterazione è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.

Errori comuni nell'iterazione

I cicli sono semplici, ma alcuni errori mettono ripetutamente in difficoltà chi è alle prime armi.

In questa lezione esaminiamo gli errori di iterazione più comuni e come evitarli.

Modificare durante l'iterazione

L'errore più grave consiste nel modificare una raccolta mentre si esegue foreach su di essa.

Aggiungere o rimuovere elementi durante l'iterazione genera un'InvalidOperationException in fase di esecuzione.

foreach (var n in list)
{
    if (n < 0) list.Remove(n); // ERROR at runtime
}

La soluzione sicura

Per rimuovere elementi durante il ciclo, iteri su una copia oppure raccolga prima gli elementi e li rimuova in seguito.

Iterare su list.ToList() fornisce uno snapshot separato da attraversare.

var list = new List<int> { 1, -2, 3, -4 };
foreach (var n in list.ToList())
{
    if (n < 0) list.Remove(n);
}
Console.WriteLine(string.Join(",", list));

Errore off-by-one nei cicli for

In un ciclo for manuale, usare <= invece di < accede oltre la fine.

Gli indici validi vanno da 0 a Length - 1, quindi la condizione dovrebbe essere i < Length.

for (int i = 0; i <= arr.Length; i++) // BUG: <= goes too far
{
    Console.WriteLine(arr[i]);
}

IndexOutOfRange

Questo errore off-by-one causa un'IndexOutOfRangeException.

foreach evita completamente questo problema, perché non usa mai un indice. Lo preferisca quando deve soltanto leggere gli elementi.

string[] arr = { "a", "b", "c" };
for (int i = 0; i < arr.Length; i++) // correct: < Length
{
    Console.WriteLine(arr[i]);
}

Aspettarsi che foreach modifichi gli elementi

Assegnare un valore alla variabile del ciclo non modifica la raccolta e, per i tipi valore, si tratta comunque di una copia.

Per aggiornare gli elementi, utilizzi un ciclo for con indicizzazione.

int[] nums = { 1, 2, 3 };
for (int i = 0; i < nums.Length; i++)
{
    nums[i] = nums[i] * 10;
}
Console.WriteLine(string.Join(",", nums));

Raccolta null

Chiamare foreach su un riferimento null genera una NullReferenceException.

Una raccolta vuota non presenta problemi, ma null sì. Verifichi o inizializzi il riferimento prima del ciclo.

List<int> data = null;
if (data != null)
{
    foreach (var x in data) Console.WriteLine(x);
}

Confusione sull'ambito delle variabili

La variabile del ciclo esiste soltanto all'interno del corpo del ciclo.

Tentare di usarla dopo il ciclo causa un errore di compilazione, perché al termine del ciclo è fuori ambito.

foreach (var n in nums)
{
    Console.WriteLine(n);
}
// Console.WriteLine(n); // ERROR: n not in scope here

Dimenticare le parentesi graffe

Senza parentesi graffe, soltanto l'istruzione singola successiva appartiene al ciclo.

Questo può compromettere la logica senza segnalazioni evidenti. Utilizzi sempre le parentesi graffe per i corpi su più righe, così da rendere chiara l'intenzione.

foreach (var n in nums)
    Console.WriteLine(n);
    Console.WriteLine("runs once, not per item");

Rischio di ciclo infinito con while

A differenza di foreach, un ciclo while può essere eseguito per sempre se la sua condizione non diventa mai falsa.

Si assicuri sempre che qualcosa all'interno del ciclo faccia progredire l'esecuzione verso la condizione di uscita.

int i = 0;
while (i < 3)
{
    Console.WriteLine(i);
    i++; // forgetting this would loop forever
}

Scegliere il ciclo giusto

Leggere ogni elemento senza bisogno di un indice → foreach.

Avere bisogno dell'indice o dover modificare gli elementi sul posto → for. Ripetere finché non cambia una condizione → while.

Verifica rapida

Verifichi ciò che ha imparato sugli errori di iterazione.

Riepilogo

Ha imparato a evitare di modificare una raccolta durante foreach, gli errori off-by-one con <=, le raccolte null e la confusione sull'ambito.

Scelga foreach per leggere, for per modificare in base all'indice e while per i cicli basati su una condizione con un'uscita ben definita.

Domande Frequenti

La lezione «Errori comuni nell'iterazione» è gratuita?

Sì — il testo completo di «Errori comuni nell'iterazione» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.

Cosa imparerò in «Errori comuni nell'iterazione»?

Modificare una collezione durante l'iterazione. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Errori comuni nell'iterazione»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Il ciclo foreach
  2. Iterare sulle collezioni
  3. break e continue
  4. Errori comuni nell'iterazione
← Torna a C# Academy