De Do...Loop-lus maakt het mogelijk om een blok code met meer flexibele beëindigingsvoorwaarden te herhalen dan For (dat is gericht op een teller) of While (waar de voorwaarde altijd aan het begin wordt gecontroleerd). In Visual Basic zijn er vier hoofdzakelijke varianten van notatie:
' Controle aan het begin Do While condition ' Lichaam van de lus Loop ' Controle aan het einde Do ' Lichaam van de lus Loop While condition ' Evenzo met Until: Do Until condition ' Lichaam van de lus Loop Do ' Lichaam van de lus Loop Until condition
Gebruik Do...Loop als:
Vraag: Wat gebeurt er als de voorwaarde condition in de lus Do While condition aanvankelijk onwaar is? Wordt er zelfs maar één keer het lichaam van de lus uitgevoerd?
Antwoord: Nee, het lichaam van de lus wordt helemaal niet uitgevoerd, omdat de controle VOOR de eerste uitvoering plaatsvindt.
Voorbeeld:
Dim i As Integer = 10 Do While i < 5 Console.WriteLine(i) i += 1 Loop ' Er zal geen regel worden weergegeven.
Geschiedenis
Tijdens de data parsing fase gebruikte de ontwikkelaar een lus
Do Until reader.EndOfStreamwaarin een regel uit het bestand werd gelezen. Maar omdatEndOfStreampas waar wordt na een poging om buiten het bestand te lezen, werd de laatste regel niet verwerkt. De juiste manier: gebruikDo While Not reader.EndOfStreamof verwerk regel voor regel en beëindig de lus op basis van de EOF-voorwaarde.
Geschiedenis
Bij de migratie van code van For naar Do...Loop werd een lus geïmplementeerd zonder expliciete incremente van de teller binnen het lichaam. Als gevolg daarvan ging het programma in een oneindige lus, omdat de beëindigingsvoorwaarde nooit werd bereikt. Het is altijd nodig om de wijziging van sleutelvariabelen binnen het lichaam van de Do...Loop te controleren.
Geschiedenis
In een van de rapportagesubsystemen gebruikte de programmeur geneste
Do...Loop-lussen zonder rekening te houden met de geneste voorwaarden vanExit Do: de interneExit Doverliet alleen de binnenste lus, niet beide. Een kortdurende blokkering bug werd alleen in productie ontdekt bij grote datavolumes.