Geschiedenis van de vraag
De For...Next-lus bestaat al sinds de eerste versies van Visual Basic en maakt het mogelijk een bereik van waarden door te lopen, vaak gebruikt voor het werken met arrays en verzamelingen. In VB.NET werd een semantisch striktere teller en ondersteuning voor stapgrootte (Step) toegevoegd.
Probleem
Een klassieke fout is het wijzigen van de waarde van de lus-teller (bijvoorbeeld i), wat leidt tot onverwacht gedrag: de teller wordt automatisch met één verhoogd/verlaagd aan het einde van elke iteratie. Het is ook belangrijk om de grenzen voor het doorlopen van verzamelingen correct in te stellen (bijvoorbeeld For i = 0 To arr.Length - 1).
Oplossing
Gebruik altijd onveranderlijke tellers of plaats een uitdrukking voor de bovenste grens in een variabele, als de collectie binnen de lus kan veranderen. Wijzig de teller-variabele niet expliciet in het lichaam van de lus.
Voorbeeldcode:
Dim arr() As Integer = {1, 2, 3, 4} For i As Integer = 0 To arr.Length - 1 Console.WriteLine(arr(i)) Next
Belangrijke kenmerken:
Wat gebeurt er als je handmatig de teller in het lichaam van de lus wijzigt?
De waarde verandert alleen binnen de huidige iteratie, maar aan het einde van de iteratie zal Visual Basic automatisch de verhoging/daling uitvoeren, wat leidt tot een onvoorspelbaar aantal doorlopen.
For i = 1 To 5 If i = 3 Then i = 1 Console.WriteLine(i) Next
Kan je For...Next gebruiken voor het doorlopen van verzamelingen, zoals List(Of T)?
Ja, maar het verdient de voorkeur om For Each te gebruiken voor verzamelingen om fouten met veranderende grootte te voorkomen. For...Next slaat alleen de indexen op.
Wat gebeurt er als de bovenlimiet lager is dan de onderlimiet bij een positieve stapgrootte?
De lus wordt geen keer uitgevoerd.
For i = 5 To 1 ' zonder Step - de lus wordt niet uitgevoerd ... Next
De teller werd handmatig gewijzigd bij het vinden van een bepaald element, en de poging om toekomstige elementen over te slaan leidde tot het overslaan van sommige iteraties en een oneindige lus.
Voordelen:
Nadelen:
Het gebruik van een aparte variabele om voorwaarden te controleren, zonder in de lus-teller te interveniëren.
Voordelen:
Nadelen: