Veelgemaakte iteratiefouten
Wijzigen tijdens het itereren.
Veelgemaakte iteratiefouten is een gratis C# Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C# Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C# Academy bevat in totaal 4 lessen.
Valkuilen bij iteratie
Lussen zijn eenvoudig, maar een paar fouten brengen beginners steeds opnieuw in de problemen.
In deze les bekijken we de meest voorkomende fouten bij iteratie en hoe je ze voorkomt.
Wijzigen tijdens iteratie
De grootste fout: een verzameling wijzigen terwijl je er met foreach doorheen loopt.
Als je tijdens een iteratie elementen toevoegt of verwijdert, treedt tijdens de uitvoering een InvalidOperationException op.
foreach (var n in list)
{
if (n < 0) list.Remove(n); // ERROR at runtime
}De veilige oplossing
Als je tijdens een lus wilt verwijderen, moet je over een kopie itereren of eerst de elementen verzamelen en ze daarna verwijderen.
Als je over list.ToList() loopt, krijg je een aparte momentopname om te doorlopen.
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));Off-by-onefouten in for-lussen
Bij een handmatige for-lus lees je voorbij het einde als je <= gebruikt in plaats van <.
Geldige indexen lopen van 0 tot Length - 1, dus de voorwaarde moet i < Length zijn.
for (int i = 0; i <= arr.Length; i++) // BUG: <= goes too far
{
Console.WriteLine(arr[i]);
}IndexOutOfRange
Die off-by-onefout veroorzaakt een IndexOutOfRangeException.
foreach voorkomt dit volledig, omdat het nooit een index gebruikt. Geef hier de voorkeur aan als je alleen elementen hoeft te lezen.
string[] arr = { "a", "b", "c" };
for (int i = 0; i < arr.Length; i++) // correct: < Length
{
Console.WriteLine(arr[i]);
}Verwachten dat foreach elementen wijzigt
Als je de lusvariabele toewijst, wijzig je de verzameling niet; bij waardetypen is die variabele bovendien een kopie.
Gebruik een for-lus met indexering om elementen bij te werken.
int[] nums = { 1, 2, 3 };
for (int i = 0; i < nums.Length; i++)
{
nums[i] = nums[i] * 10;
}
Console.WriteLine(string.Join(",", nums));Verzameling met null
Als je foreach aanroept op een null-verwijzing, treedt een NullReferenceException op.
Een lege verzameling is prima, maar null niet. Controleer de waarde of initialiseer de verzameling voordat je de lus start.
List<int> data = null;
if (data != null)
{
foreach (var x in data) Console.WriteLine(x);
}Verwarring over variabelbereik
De lusvariabele bestaat alleen binnen de body van de lus.
Als je de variabele na de lus probeert te gebruiken, krijg je een compilatiefout, omdat de variabele buiten bereik is zodra de lus eindigt.
foreach (var n in nums)
{
Console.WriteLine(n);
}
// Console.WriteLine(n); // ERROR: n not in scope hereAccolades vergeten
Zonder accolades hoort alleen de eerstvolgende enkele instructie bij de lus.
Hierdoor kan de logica ongemerkt verkeerd werken. Gebruik voor bodies met meerdere regels altijd accolades, zodat de bedoeling duidelijk blijft.
foreach (var n in nums)
Console.WriteLine(n);
Console.WriteLine("runs once, not per item");Risico op oneindigheid bij while
In tegenstelling tot foreach kan een while-lus voor altijd blijven lopen als de voorwaarde nooit onwaar wordt.
Zorg er altijd voor dat iets in de lus de uitvoering dichter bij de stopvoorwaarde brengt.
int i = 0;
while (i < 3)
{
Console.WriteLine(i);
i++; // forgetting this would loop forever
}De juiste lus kiezen
Elk element lezen, zonder index → foreach.
De index nodig hebben of ter plekke moeten wijzigen → for. Herhalen totdat een voorwaarde verandert → while.
Korte test
Test wat je hebt geleerd over fouten bij iteratie.
Samenvatting
Je hebt geleerd te voorkomen dat je een verzameling tijdens foreach wijzigt, dat je off-by-onefouten met <= maakt, dat je met lege of null-verzamelingen werkt en dat je bereikverwarring voorkomt.
Kies foreach om te lezen, for om op index te wijzigen en while voor lussen op basis van een voorwaarde met een duidelijke stop.
Leer C# met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 93
- Lessen
- 346
Veelgestelde vragen
Is de les “Veelgemaakte iteratiefouten” gratis?
Ja — de volledige tekst van “Veelgemaakte iteratiefouten” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus C# Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus C# Academy bevat in totaal 4 lessen.
Wat leer ik in “Veelgemaakte iteratiefouten”?
Wijzigen tijdens het itereren. Je oefent met C# Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met C# Academy te beginnen?
Ervaring vooraf is niet nodig. C# Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “Veelgemaakte iteratiefouten”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over C# Academy?
Ja. Elke les over C# Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- De foreach-lus
- Door collecties itereren
- break en continue
- Veelgemaakte iteratiefouten