For...Next – příkaz (Visual Basic)

Opakuje skupinu příkazů v zadaném počtu opakování.

Syntax

For counter [ As datatype ] = start To end [ Step step ]
    [ statements ]
    [ Continue For ]
    [ statements ]
    [ Exit For ]
    [ statements ]
Next [ counter ]

Součásti

Část Popis
counter Vyžadováno v For příkazu. Číselná proměnná. Řídicí proměnná pro smyčku. Další informace najdete v části argument čítače dále v tomto tématu.
datatype Nepovinný parametr. Datový typ counter . Další informace najdete v části argument čítače dále v tomto tématu.
start Povinná hodnota. Číselný výraz. Počáteční hodnota counter .
end Povinná hodnota. Číselný výraz. Konečná hodnota counter .
step Nepovinný parametr. Číselný výraz. Hodnota, o kterou counter se při každém průchodu smyčkou zvýší.
statements Nepovinný parametr. Jeden nebo více příkazů mezi For a Next , které spouštějí zadaný počet opakování.
Continue For Nepovinný parametr. Převede řízení na další iteraci smyčky.
Exit For Nepovinný parametr. Přenese řízení ze For smyčky.
Next Povinná hodnota. Ukončí definici For smyčky.

Poznámka

ToKlíčové slovo se používá v tomto příkazu k určení rozsahu čítače. Toto klíčové slovo lze použít také v poli Vybrat... Příkaz Case a v deklaracích Array. Další informace o deklaracích pole naleznete v tématu Dim Statement.

Jednoduché příklady

ForStrukturu... použijete, Next Pokud chcete zopakovat sadu příkazů a nastavit počet opakování.

V následujícím příkladu index Proměnná začíná hodnotou 1 a je zvyšována s každou iterací smyčky, která končí po hodnotě index 5.

For index As Integer = 1 To 5
    Debug.Write(index.ToString & " ")
Next
Debug.WriteLine("")
' Output: 1 2 3 4 5

V následujícím příkladu number Proměnná začíná 2 a při každé iteraci smyčky je snížena o 0,25 až po hodnotě number dosáhne 0. StepArgument -.25 snižuje hodnotu o 0,25 při každé iteraci smyčky.

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 

Tip

A while... Příkaz End While nebo do... Příkaz LOOP funguje dobře, Pokud nevíte, jak dlouho chcete spustit příkazy ve smyčce. Nicméně pokud očekáváte, že se má smyčka spustit určitou dobu, For Next je lepší volbou smyčka.... Určíte počet iterací při prvním zadání smyčky.

Vnořování smyček

Smyčky můžete vnořovat vložením For jedné smyčky do jiné. Následující příklad ukazuje vnořené For ... Next struktury, které mají různé hodnoty kroku. Vnější smyčka vytvoří řetězec pro každou iteraci smyčky. Vnitřní smyčka snižuje proměnnou počítadla smyčky pro každou iteraci smyčky.

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

Při vnořování smyček musí mít každá smyčka jedinečnou counter proměnnou.

Různé struktury ovládacích prvků lze také vnořovat mezi sebou. Další informace najdete v tématu vnořené řídicí struktury.

Ukončit po a pokračovat pro

Exit ForPříkaz okamžitě ukončí For ...Next Loop a přenáší řízení příkazu, který následuje po Next příkazu.

Continue ForPříkaz přenáší řízení okamžitě na další iteraci smyčky. Další informace najdete v tématu příkaz Continue.

Následující příklad ilustruje použití Continue For Exit For příkazů a.

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

Do... můžete vložit libovolný počet Exit For příkazů For ...Next Procházet. Při použití v rámci vnořeného For ...Next smyčky, Exit For ukončí vnitřní smyčku a přenáší řízení na další vyšší úroveň vnoření.

Exit For se často používá po vyhodnocení nějaké podmínky (například v If ... Then ...Else struktura). Je možné, že budete chtít použít Exit For následující podmínky:

  • Pokračování iterace je zbytečné nebo nemožné. Tato podmínka může vytvořit chybná hodnota nebo žádost o ukončení.

  • A.. Try . Catch ...Finally příkaz zachytí výjimku. Můžete použít Exit For na konci Finally bloku.

  • Máte nekonečné smyčky, což je smyčka, která by mohla běžet velkým nebo dokonce nekonečným počtem výskytů. Pokud tuto podmínku zjistíte, můžete ji použít Exit For k řídicímu panelu smyčky. Další informace najdete v části do... Příkaz LOOP

Technická implementace

při For spuštění smyčky... Next Visual Basic vyhodnotí start , end a step . Visual Basic vyhodnotí tyto hodnoty pouze v tuto chvíli a pak je přiřadí start counter . před spuštěním bloku příkazu Visual Basic porovnává counter end . Pokud counter je již větší než end hodnota (nebo menší, pokud step je záporná), For cyklus končí a ovládací prvek projde příkazu, který následuje po Next příkazu. V opačném případě se spustí blok příkazu.

pokaždé, když Visual Basic nalezne Next příkaz, se zvýší counter o step a vrátí se k For příkazu. Znovu porovná counter s end a znovu buď spustí blok, nebo ukončí smyčku v závislosti na výsledku. Tento proces pokračuje do doby, než se dokončí counter end nebo dojde Exit For k příkazu.

Smyčka se neukončí counter , dokud nebyla úspěšná end . Pokud counter je rovno end , smyčka pokračuje. Porovnání, které určuje, zda má být blok spuštěn, je- counter <= end li step kladné a counter >= end Pokud step je záporné.

Pokud změníte hodnotu counter uvnitř smyčky, váš kód může být obtížnější číst a ladit. Změna hodnoty start , end nebo step nemá vliv na hodnoty iterace, které byly určeny při prvním zadání smyčky.

Pokud vnořování smyček, kompilátor signalizuje chybu, pokud nalezne Next příkaz vnější úrovně vnořování před Next příkazem vnitřní úrovně. Kompilátor však může tuto chybu překrývají pouze v případě, že zadáte counter příkaz v každém Next příkazu.

Argument kroku

Hodnota step může být buď kladná, nebo záporná. Tento parametr určuje zpracování smyčky podle následující tabulky:

Hodnota kroku Smyčka se spustí, pokud
Kladná nebo nulová counter <= end
Záporný counter >= end

Výchozí hodnota step je 1 MB.

Argument čítače

Následující tabulka uvádí, zda counter definuje novou místní proměnnou, která je vymezena na celou For…Next smyčku. Toto určení závisí na tom, zda datatype je přítomno a zda counter je již definován.

Je k datatype dispozici? Je counter již definováno? Výsledek (určuje, zda je counter definována Nová místní proměnná, která je vymezena na celou For...Next smyčku)
No Ano Ne, protože counter už je definovaná. Pokud obor counter není pro proceduru místní, zobrazí se upozornění při kompilaci.
No No Yes. Datový typ je odvozen z start výrazů end , a step . Informace o odvození typu najdete v tématu Option Infer – příkaz a Odvození místního typu.
Ano Ano Ano, ale jenom v counter případě, že je existující proměnná definovaná mimo proceduru. Tato proměnná zůstává oddělená. Pokud je rozsah existující proměnné místní pro counter proceduru, dojde k chybě při kompilaci.
Ano No Yes.

Datový typ určuje counter typ iterace, který musí být jeden z následujících typů:

  • A Byte , , , , , , , , SByte , nebo UShort Short UInteger Integer ULong Long Decimal Single Double .

  • Výčet, který deklarujete pomocí příkazu výčtu.

  • . Object

  • Typ, T který má následující operátory, kde je B typ, který lze použít ve Boolean výrazu.

    Public Shared Operator >= (op1 As T, op2 As T) As B

    Public Shared Operator <= (op1 As T, op2 As T) As B

    Public Shared Operator - (op1 As T, op2 As T) As T

    Public Shared Operator + (op1 As T, op2 As T) As T

Volitelně můžete zadat counter proměnnou v Next příkazu . Tato syntaxe zlepšuje čitelnost programu, zejména pokud máte vnořené For smyčky. Musíte zadat proměnnou, která se zobrazí v odpovídajícím For příkazu .

Výrazy , a start lze vyhodnotit na libovolný datový end step typ, který se rozšiřuje na typ counter . Pokud použijete uživatelem definovaný typ pro , bude pravděpodobně nutné definovat operátor převodu pro převod typů , nebo counter CType na typ start end step counter .

Příklad 1

Následující příklad odebere všechny prvky z obecného seznamu. Místo for each... Následující příkazv příkladu ukazuje For příkaz ... , který Next iteruje v sestupném pořadí. Tento příklad používá tuto techniku, protože metoda způsobí, že prvky za removeAt odebraným prvkem budou mít nižší hodnotu indexu.

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

Příklad 2

Následující příklad iteruje výčet, který je deklarován pomocí příkazu výčtu.

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

Příklad 3

V následujícím příkladu používají parametry příkazu třídu, která má přetížení operátoru pro operátory , , a + - >= <= .

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

Viz také