For...Next — Instrukcja (Visual Basic)

Powtarza grupę instrukcji określoną liczbę razy.

Składnia

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

generatora

Element opis
counter Wymagane w instrukcji For . Zmienna liczbowa. Zmienna sterowa dla pętli. Aby uzyskać więcej informacji, zobacz Argument licznika w dalszej części tego tematu.
datatype Opcjonalny. Typ danych elementu counter. Aby uzyskać więcej informacji, zobacz Argument licznika w dalszej części tego tematu.
start Wymagany. Wyrażenie liczbowe. Początkowa wartość counter.
end Wymagany. Wyrażenie liczbowe. Końcowa wartość .counter
step Opcjonalny. Wyrażenie liczbowe. Ilość, o którą counter jest zwiększana za każdym razem przez pętlę.
statements Opcjonalny. Co najmniej jedna instrukcja między For i Next , która uruchamia określoną liczbę razy.
Continue For Opcjonalny. Przenosi kontrolkę do następnej iteracji pętli.
Exit For Opcjonalny. Przenosi kontrolkę poza pętlę For .
Next Wymagany. Przerywa definicję For pętli.

Uwaga

Słowo To kluczowe jest używane w tej instrukcji, aby określić zakres licznika. Możesz również użyć tego słowa kluczowego w obszarze Wybierz... Case, instrukcja i deklaracje tablicy. Aby uzyskać więcej informacji na temat deklaracji tablic, zobacz Dim, instrukcja.

Proste przykłady

ForUżywasz struktury ...Next , gdy chcesz powtórzyć zestaw instrukcji określoną liczbę razy.

W poniższym przykładzie zmienna index zaczyna się od wartości 1 i jest zwiększana z każdą iterację pętli, kończąc się po osiągnięciu index wartości 5.

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

W poniższym przykładzie zmienna number zaczyna się od 2 i jest zmniejszana o 0,25 w każdej iteracji pętli, kończąc się po osiągnięciu wartości number 0. Argument Step-.25 pętli zmniejsza wartość o 0,25 w każdej iteracji pętli.

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 

Napiwek

Chwilę ... End While, instrukcja lub wykonaj... Instrukcja pętli działa dobrze, gdy nie wiesz z wyprzedzeniem, ile razy należy uruchomić instrukcje w pętli. Jeśli jednak spodziewasz się, że pętla będzie uruchamiana określoną liczbę razy, pętla For...Next jest lepszym wyborem. Podczas pierwszego wprowadzania pętli określa się liczbę iteracji.

Pętle zagnieżdżania

Pętle można zagnieżdżać For , umieszczając jedną pętlę w innej. W poniższym przykładzie pokazano zagnieżdżone Forstruktury ...Next o różnych wartościach kroków. Pętla zewnętrzna tworzy ciąg dla każdej iteracji pętli. Pętla wewnętrzna dekreuje zmienną licznika pętli dla każdej iteracji pętli.

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

W przypadku zagnieżdżania pętli każda pętla musi mieć unikatową counter zmienną.

Można również zagnieżdżać różne rodzaje struktur sterujących nawzajem. Aby uzyskać więcej informacji, zobacz Zagnieżdżone struktury kontrolek.

Zakończ działanie dla i kontynuuj

Instrukcja Exit For natychmiast kończy Fordziałanie ...Next pętla i transferuje kontrolkę do instrukcji , która jest zgodna z instrukcją Next .

Instrukcja Continue For przenosi kontrolkę natychmiast do następnej iteracji pętli. Aby uzyskać więcej informacji, zobacz Continue, instrukcja.

Poniższy przykład ilustruje użycie instrukcji Continue For i Exit For .

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

Można umieścić dowolną liczbę instrukcji Exit For w ...ForNext Pętli. W przypadku użycia w zagnieżdżonym For...Next pętle, Exit For zamyka najbardziej wewnętrzną pętlę i przenosi kontrolkę do następnego wyższego poziomu zagnieżdżania.

Exit Forjest często używany po ocenie pewnego warunku (na przykład w ...IfThen...Else struktura). Może być konieczne użycie Exit For następujących warunków:

  • Kontynuowanie iteracji jest niepotrzebne lub niemożliwe. Błędna wartość lub żądanie zakończenia może utworzyć ten warunek.

  • Catch...Try...Finally instrukcja przechwytuje wyjątek. Możesz użyć Exit For na końcu Finally bloku.

  • Masz nieskończoną pętlę, która jest pętlą, która może uruchamiać dużą lub nawet nieskończoną liczbę razy. Jeśli wykryjesz taki warunek, możesz użyć Exit For metody w celu ucieczki pętli. Aby uzyskać więcej informacji, zobacz Do... Loop, instrukcja.

Realizacja techniczna

Po uruchomieniu Forpętli ...Next program Visual Basic oblicza startwartości , endi step. Program Visual Basic ocenia te wartości tylko w tej chwili, a następnie przypisuje start je do counterelementu . Przed uruchomieniem bloku instrukcji program Visual Basic porównuje counter się z elementem end. Jeśli counter wartość jest już większa niż end wartość (lub mniejsza, jeśli step jest ujemna), For pętla kończy się i kontrolka przechodzi do instrukcji, która jest zgodna z instrukcją Next . W przeciwnym razie blok instrukcji jest uruchamiany.

Za każdym razem, gdy program Visual Basic napotka instrukcję Next , zwiększa counterstep ją i wraca do instrukcji For . Ponownie porównuje counterendsię z elementem , a ponownie uruchamia blok lub zamyka pętlę w zależności od wyniku. Ten proces będzie kontynuowany do momentu counter wystąpienia instrukcji lub przejścia end instrukcji Exit For .

Pętla nie zatrzymuje się, dopóki counter nie przejdzie .end Jeśli counter wartość jest równa end, pętla będzie kontynuowana. Porównanie, które określa, czy uruchomić blok jest counter<= end jeśli step jest dodatni i counter>= end jeśli step jest ujemny.

Jeśli zmienisz wartość counter elementu wewnątrz pętli, kod może być trudniejszy do odczytania i debugowania. Zmiana wartości start, endlub step nie ma wpływu na wartości iteracji, które zostały określone podczas pierwszego wprowadzenia pętli.

Jeśli zagnieżdżasz pętle, kompilator sygnalizuje Next błąd, jeśli napotka instrukcję zewnętrznego poziomu zagnieżdżania przed Next instrukcją poziomu wewnętrznego. Jednak kompilator może wykryć ten nakładany błąd tylko wtedy, gdy zostanie określony counter w każdej Next instrukcji.

Argument kroku

Wartość może być dodatnia step lub ujemna. Ten parametr określa przetwarzanie pętli zgodnie z następującą tabelą:

Wartość kroku Pętla jest wykonywana, jeśli
Dodatnie lub zero counter<= end
Negatywne counter>= end

Wartość domyślna to step 1.

Argument licznika

Poniższa tabela wskazuje, czy counter definiuje nową zmienną lokalną, która jest ograniczona do całej For…Next pętli. Ta determinacja zależy od tego, czy datatype jest obecny i czy counter jest już zdefiniowany.

Czy jest datatype obecny? Czy już counter zdefiniowano? Wynik (czy counter definiuje nową zmienną lokalną, która jest ograniczona do całej For...Next pętli)
Nie. Tak Nie, ponieważ counter jest już zdefiniowany. Jeśli zakres counter nie jest lokalny dla procedury, zostanie wyświetlone ostrzeżenie dotyczące czasu kompilacji.
Nie Nie. Tak. Typ danych jest wnioskowany z startwyrażeń , endi step . Aby uzyskać informacje na temat wnioskowania typu, zobacz Instrukcja wnioskowania opcji i Wnioskowanie typu lokalnego.
Tak Tak Tak, ale tylko wtedy, gdy istniejąca counter zmienna jest zdefiniowana poza procedurą. Ta zmienna pozostaje oddzielna. Jeśli zakres istniejącej counter zmiennej jest lokalny dla procedury, wystąpi błąd czasu kompilacji.
Tak Nie. Tak.

Typ danych określa counter typ iteracji, który musi być jednym z następujących typów:

  • A Byte, , UShortUIntegerIntegerShortSByteLongDecimalULongSinglelub .Double

  • Wyliczenie zadeklarowane przy użyciu instrukcji wyliczenia.

  • An Object.

  • Typ T , który ma następujące operatory, gdzie B jest typem, który może być używany w wyrażeniu Boolean .

    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

Opcjonalnie można określić zmienną counter w instrukcji Next . Ta składnia poprawia czytelność programu, zwłaszcza jeśli masz zagnieżdżone For pętle. Musisz określić zmienną wyświetlaną w odpowiedniej For instrukcji.

Wyrażenia start, endi step mogą oceniać dowolny typ danych, który rozszerza typ counter. Jeśli używasz typu zdefiniowanego przez użytkownika dla counterprogramu , może być konieczne zdefiniowanie CType operatora konwersji w celu przekonwertowania typów start, endlub step na typ counter.

Przykład 1

Poniższy przykład usuwa wszystkie elementy z listy ogólnej. Zamiast dla każdego... Następna instrukcja przedstawia instrukcję For...Next , która iteruje w kolejności malejącej. W tym przykładzie użyto tej techniki, ponieważ metoda powoduje, że removeAt elementy po usunięciu elementu mają niższą wartość indeksu.

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

Przykład 2

W poniższym przykładzie iteruje się za pomocą wyliczenia zadeklarowanego przy użyciu instrukcji wyliczenia.

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

Przykład 3

W poniższym przykładzie parametry instrukcji używają klasy, która ma przeciążenia operatorów dla +operatorów , -, >=i <= .

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

Zobacz też