Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Herhaalt een groep instructies terwijl de lusvariabele zijn eindwaarde bereikt.
Syntaxis
For counter [ As datatype ] = start To end [ Step step ]
[ statements ]
[ Continue For ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ counter ]
Onderdelen
| Onderdeel | Beschrijving |
|---|---|
counter |
Vereist in de For verklaring. Numerieke variabele. De besturingsvariabele voor de lus. Voor meer informatie, zie Counter Argument verderop in dit onderwerp. |
datatype |
Facultatief. Gegevenstype van counter. Voor meer informatie, zie Counter Argument verderop in dit onderwerp. |
start |
Verplicht. Numerieke expressie. De initiële waarde van counter. |
end |
Verplicht. Numerieke expressie. De uiteindelijke waarde van counter. |
step |
Facultatief. Numerieke expressie. Het bedrag waarmee counter elke keer door de lus wordt verhoogd. |
statements |
Facultatief. Een of meer instructies tussen For en Next die het opgegeven aantal keren uitvoeren. |
Continue For |
Facultatief. Draagt de controle over naar de volgende iteratie van de lus. |
Exit For |
Facultatief. Hiermee wordt het beheer buiten de lus For overgedragen. |
Next |
Verplicht. Hiermee wordt de definitie van de For lus beëindigd. |
Opmerking
Het To trefwoord wordt in deze instructie gebruikt om het bereik voor de teller op te geven. U kunt dit trefwoord ook gebruiken in de Select...Case-instructie en in arraydeclaraties. Zie Dim-instructie voor meer informatie over matrixdeclaraties.
Eenvoudige voorbeelden
U gebruikt een For...Next -structuur als u een set instructies een bepaald aantal keren wilt herhalen.
In het volgende voorbeeld begint de index-variabele met een waarde van 1 en wordt verhoogd met elke iteratie van de lus, eindigend wanneer de waarde van index 5 bereikt.
For index As Integer = 1 To 5
Debug.Write(index.ToString & " ")
Next
Debug.WriteLine("")
' Output: 1 2 3 4 5
In het volgende voorbeeld begint de number variabele bij 2 en wordt bij elke iteratie van de lus met 0,25 verminderd, eindigend na de waarde van number 0. Het Step argument van -.25 vermindert de waarde met 0,25 bij elke iteratie van de lus.
For number As Double = 2 To 0 Step -0.25
Debug.Write(number.ToString & " ")
Next
Debug.WriteLine("")
' Output: 2 1.75 1.5 1.25 1 0.75 0.5 0.25 0
Aanbeveling
Een While...End While-verklaring of Do...Loop-verklaring werkt goed wanneer u niet van tevoren weet hoe vaak de instructies in de lus moeten worden uitgevoerd. Wanneer u echter verwacht dat de lus een bepaald aantal keren wordt uitgevoerd, is een For...Next lus een betere keuze. U bepaalt het aantal iteraties wanneer u de lus voor het eerst invoert.
Geneste lussen
U kunt For lussen nesten door de ene lus binnen een andere te plaatsen. In het volgende voorbeeld ziet u geneste For...Next structuren met verschillende stapwaarden. De buitenste lus maakt een tekenreeks voor elke iteratie van de lus. De binnenste lus verlaagt een lustellervariabele voor elke herhaling van de lus.
For indexA = 1 To 3
' Create a new StringBuilder, which is used
' to efficiently build strings.
Dim sb As New System.Text.StringBuilder()
' Append to the StringBuilder every third number
' from 20 to 1 descending.
For indexB = 20 To 1 Step -3
sb.Append(indexB.ToString)
sb.Append(" ")
Next indexB
' Display the line.
Debug.WriteLine(sb.ToString)
Next indexA
' Output:
' 20 17 14 11 8 5 2
' 20 17 14 11 8 5 2
' 20 17 14 11 8 5 2
Bij het nesten van lussen moet elke lus een unieke counter variabele hebben.
U kunt ook verschillende soorten besturingsstructuren binnen elkaar nesten. Zie voor meer informatie Geneste besturingsstructuren.
Verlaat For en Ga verder met For
De Exit For instructie beëindigt onmiddellijk de For...
Next lus en draagt het besturingselement over naar de instructie die volgt op de Next instructie.
De Continue For instructie geeft de controle onmiddellijk over aan de volgende iteratie van de lus. Zie Continue-instructie voor meer informatie.
In het volgende voorbeeld ziet u het gebruik van de Continue For- en Exit For-instructies.
For index As Integer = 1 To 100000
' If index is between 5 and 7, continue
' with the next iteration.
If index >= 5 AndAlso index <= 8 Then
Continue For
End If
' Display the index.
Debug.Write(index.ToString & " ")
' If index is 10, exit the loop.
If index = 10 Then
Exit For
End If
Next
Debug.WriteLine("")
' Output: 1 2 3 4 9 10
U kunt een willekeurig aantal Exit For statements in een For...
Next lus. Wanneer gebruikt binnen geneste For...
Next lus, Exit For verlaat de binnenste lus en draagt de controle over naar het volgende hogere niveau van nesten.
Exit For wordt vaak gebruikt nadat u een bepaalde voorwaarde hebt geëvalueerd (bijvoorbeeld in een If...Then...Else structuur). Mogelijk wilt u deze voorwaarden gebruiken Exit For :
Doorgaan met herhalen is onnodig of onmogelijk. Een onjuiste waarde of een beëindigingsaanvraag kan deze voorwaarde maken.
Een
Try...Catch...Finallyinstructie handelt een uitzondering af. U kunt aan het einde van hetExit Forblok gebruikenFinally.U hebt een eindeloze lus, een lus die een groot of zelfs oneindig aantal keren kan worden uitgevoerd. Als u een dergelijke voorwaarde detecteert, kunt u de lus met
Exit Fordoorbreken. Zie voor meer informatie Do...Loop-instructie.
Technische implementatie
Wanneer een For...Next-lus wordt gestart, evalueert Visual Basic start, end en step. Visual Basic evalueert deze waarden alleen op dit moment en wijst start vervolgens toe aan counter. Voordat het instructieblok wordt uitgevoerd, vergelijkt Visual Basic counter met end. Als counter al groter is dan de end-waarde (of kleiner als step negatief is), eindigt de For-lus en gaat de besturing naar de instructie die volgt op de Next-instructie. Anders wordt het declaratieblok uitgevoerd.
Telkens wanneer Visual Basic de Next-instructie tegenkomt, wordt counter met step verhoogd en keert terug naar de For-instructie. Opnieuw vergelijkt counter het met end, en opnieuw wordt het blok uitgevoerd of wordt de lus afgesloten, afhankelijk van het resultaat. Dit proces wordt voortgezet totdat counter voorbij end gaat of een Exit For-instructie wordt aangetroffen.
De lus stopt pas als counter voorbij end is gegaan. Als counter gelijk is aan end, herhaalt de lus zich. De vergelijking die bepaalt of het blok moet worden uitgevoerd, is counter<= end als step positief en counter>= end als step dit negatief is.
Als u de waarde van counter wijzigt terwijl u zich in een lus bevindt, kan het lastiger zijn om uw code te lezen en fouten op te sporen. Het wijzigen van de waarde van start, endof step heeft geen invloed op de iteratiewaarden die zijn bepaald toen de lus voor het eerst werd ingevoerd.
Als u lussen nestelt, geeft de compiler een foutmelding als deze de Next instructie van een buitenste nestniveau tegenkomt vóór de Next instructie van een binnenste niveau. De compiler kan deze overlappende fout echter alleen detecteren als u counter in elke Next verklaring opgeeft.
Stapargument
De waarde van step kan positief of negatief zijn. Deze parameter bepaalt lusverwerking volgens de volgende tabel:
| Stapwaarde | Lus wordt uitgevoerd als |
|---|---|
| Positief of nul |
counter
<= end |
| Negatief |
counter
>= end |
De standaardwaarde van step is 1.
Tegenargument
In de volgende tabel wordt aangegeven of counter een nieuwe lokale variabele definieert die van toepassing is op de hele For…Next lus. Deze bepaling is afhankelijk van of datatype aanwezig is en of counter al is gedefinieerd.
Is datatype aanwezig? |
Is counter al gedefinieerd? |
Resultaat (of counter er een nieuwe lokale variabele wordt gedefinieerd die is gericht op de hele For...Next lus) |
|---|---|---|
| Nee. | Ja | Nee, omdat counter dit al is gedefinieerd. Als het bereik van counter niet lokaal is voor de procedure, ontstaat er een compile-tijd waarschuwing. |
| Nee. | Nee. | Ja. Het gegevenstype wordt afgeleid van de start, end en step expressies. Zie Option Infer Statement en Local Type Inference voor informatie over typedeductie. |
| Ja | Ja | Ja, maar alleen als de bestaande counter variabele buiten de procedure is gedefinieerd. Die variabele blijft gescheiden. Als het bereik van de bestaande counter variabele lokaal is voor de procedure, treedt er een compilatietijdfout op. |
| Ja | Nee. | Ja. |
Het gegevenstype bepaalt counter het type iteratie, dat een van de volgende typen moet zijn:
Een
Byte,SByte,UShort,Short,UInteger,Integer,ULong,Long,Decimal,Single, ofDouble.Een opsomming die u declareert met behulp van een Enum-instructie.
Een
Object.Een type
Tmet de volgende operatoren, waarbijBeen type is dat kan worden gebruikt in eenBooleanexpressie.Public Shared Operator >= (op1 As T, op2 As T) As BPublic Shared Operator <= (op1 As T, op2 As T) As BPublic Shared Operator - (op1 As T, op2 As T) As TPublic Shared Operator + (op1 As T, op2 As T) As T
U kunt desgewenst de counter variabele in de Next instructie opgeven. Deze syntaxis verbetert de leesbaarheid van uw programma, met name als u geneste For lussen hebt. U moet de variabele opgeven die wordt weergegeven in de bijbehorende For instructie.
De start, enden step expressies kunnen evalueren op elk gegevenstype dat wordt uitgebreid tot het type counter. Als u een door de gebruiker gedefinieerd type gebruikt counter, moet u mogelijk de CType conversieoperator definiëren om de typen start, endof step naar het type counterte converteren.
Voorbeeld 1
In het volgende voorbeeld worden alle elementen uit een algemene lijst verwijderd. In plaats van een For Each... Volgende instructie toont het voorbeeld een For...Next -instructie die in aflopende volgorde wordt herhaald. In het voorbeeld wordt deze techniek gebruikt omdat de removeAt methode ervoor zorgt dat elementen na het verwijderde element een lagere indexwaarde hebben.
Dim lst As New List(Of Integer) From {10, 20, 30, 40}
For index As Integer = lst.Count - 1 To 0 Step -1
lst.RemoveAt(index)
Next
Debug.WriteLine(lst.Count.ToString)
' Output: 0
Voorbeeld 2
In het volgende voorbeeld wordt een opsomming herhaald die wordt gedeclareerd met behulp van een Enum-instructie.
Public Enum Mammals
Buffalo
Gazelle
Mongoose
Rhinoceros
Whale
End Enum
Public Sub ListSomeMammals()
For mammal As Mammals = Mammals.Gazelle To Mammals.Rhinoceros
Debug.Write(mammal.ToString & " ")
Next
Debug.WriteLine("")
' Output: Gazelle Mongoose Rhinoceros
End Sub
Voorbeeld 3
In het volgende voorbeeld gebruiken de instructieparameters een klasse met operator-overloads voor de operators +, -, >= en <=.
Private Class Distance
Public Property Number() As Double
Public Sub New(ByVal number As Double)
Me.Number = number
End Sub
' Define operator overloads to support For...Next statements.
Public Shared Operator +(ByVal op1 As Distance, ByVal op2 As Distance) As Distance
Return New Distance(op1.Number + op2.Number)
End Operator
Public Shared Operator -(ByVal op1 As Distance, ByVal op2 As Distance) As Distance
Return New Distance(op1.Number - op2.Number)
End Operator
Public Shared Operator >=(ByVal op1 As Distance, ByVal op2 As Distance) As Boolean
Return (op1.Number >= op2.Number)
End Operator
Public Shared Operator <=(ByVal op1 As Distance, ByVal op2 As Distance) As Boolean
Return (op1.Number <= op2.Number)
End Operator
End Class
Public Sub ListDistances()
Dim distFrom As New Distance(10)
Dim distTo As New Distance(25)
Dim distStep As New Distance(4)
For dist As Distance = distFrom To distTo Step distStep
Debug.Write(dist.Number.ToString & " ")
Next
Debug.WriteLine("")
' Output: 10 14 18 22
End Sub