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 ]
Części
Część | 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 typu counter . Aby uzyskać więcej informacji, zobacz Argument licznika w dalszej części tego tematu. |
start |
Wymagane. Wyrażenie liczbowe. Początkowa wartość .counter |
end |
Wymagane. 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 kontrolę z For pętli. |
Next |
Wymagane. Przerywa definicję For pętli. |
Uwaga
Słowo To
kluczowe jest używane w tej instrukcji do określania zakresu dla 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
Struktura ...Next
jest używanaFor
, gdy chcesz powtórzyć zestaw instrukcji określoną liczbę razy.
W poniższym przykładzie zmienna index
rozpoczyna się od wartości 1 i jest zwiększana wraz z każdą iterację pętli, kończąc się po osiągnięciu wartości index
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
rozpoczyna się od 2 i zmniejsza się o 0,25 w każdej iteracji pętli, kończąc się po osiągnięciu wartości number
0. Argument Step
funkcji -.25
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
Porada
Chwila... End While, instrukcja lub wykonywanie... Instrukcja pętli działa dobrze, gdy nie wiesz z wyprzedzeniem, ile razy uruchomić instrukcje w pętli. Jednak jeśli oczekujesz uruchomienia pętli określoną liczbę razy, pętla For
...Next
jest lepszym wyborem. Określasz liczbę iteracji podczas pierwszego wprowadzania pętli.
Pętle zagnieżdżenia
Pętle można zagnieżdżać For
, umieszczając jedną pętlę w innej. W poniższym przykładzie pokazano zagnieżdżone For
struktury ...Next
z różnymi wartościami kroków. Pętla zewnętrzna tworzy ciąg dla każdej iteracji pętli. Pętla wewnętrzna dekrementuje 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 między sobą. Aby uzyskać więcej informacji, zobacz Zagnieżdżone struktury kontrolek.
Zakończ dla i kontynuuj dla
Instrukcja Exit For
natychmiast kończy For
dział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.
W poniższym przykładzie pokazano 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 ...For
Next
Pętli. W przypadku użycia w zagnieżdżonym For
...Next
pętle, Exit For
zamyka najbardziej wewnętrzną pętlę i przenosi kontrolę do następnego wyższego poziomu zagnieżdżania.
Exit For
jest często używany po dokonaniu oceny pewnego warunku (na przykład w ...If
Then
...Else
struktura). Warto użyć 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.
A
Try
...Catch
...Finally
instrukcja przechwytuje wyjątek. Możesz użyćExit For
wartości na końcuFinally
bloku.Masz pętlę nieskończoną, która jest pętlą, która może uruchamiać dużą, a nawet nieskończoną liczbę razy. Jeśli wykryjesz taki warunek, możesz użyć
Exit For
polecenia , aby uciec od pętli. Aby uzyskać więcej informacji, zobacz Do... Loop, instrukcja.
Realizacja techniczna
Po uruchomieniu For
pętli ...Next
program Visual Basic oblicza start
wartości , end
i step
. Program Visual Basic ocenia te wartości tylko w tej chwili, a następnie przypisuje start
je do elementu counter
. Przed uruchomieniem bloku instrukcji visual Basic porównuje się z elementem counter
end
. Jeśli counter
wartość jest już większa niż end
wartość (lub mniejsza, jeśli step
jest ujemna), pętla For
kończy się i kontrolka przechodzi do instrukcji, która następuje po instrukcji Next
. W przeciwnym razie blok instrukcji zostanie uruchomiony.
Za każdym razem, gdy program Visual Basic napotyka instrukcję Next
, zwiększa counter
step
ją i wraca do instrukcji For
. Ponownie jest porównywana counter
z end
wartością , a ponownie uruchamia blok lub zamyka pętlę w zależności od wyniku. Ten proces będzie kontynuowany do momentu counter
end
przejścia lub Exit For
napotkania instrukcji.
Pętla nie zatrzymuje się, dopóki counter
nie minie end
. Jeśli counter
wartość jest równa end
, pętla będzie kontynuowana. Porównanie określające, czy uruchomić blok ma wartość counter
<= end
jeśli step
jest dodatnia, i counter
>= end
jeśli step
jest ujemna.
Jeśli zmienisz wartość counter
elementu wewnątrz pętli, kod może być trudniejszy do odczytania i debugowania. Zmiana wartości start
, end
lub 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 błąd, jeśli napotka Next
instrukcję zewnętrznego poziomu zagnieżdżenia 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ść step
może być dodatnia 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 zerowe | counter <= end |
Ujemne | counter >= end |
Wartość domyślna elementu step
to 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 counter już 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 procedury counter nie jest lokalny, zostanie wyświetlone ostrzeżenie w czasie kompilacji. |
Nie | Nie | Tak. Typ danych jest wnioskowany z start wyrażeń , end i step . Aby uzyskać informacje o wnioskowaniu typu, zobacz Instrukcje 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
,SByte
UInteger
Integer
Short
UShort
Long
Decimal
ULong
Single
lub .Double
Wyliczenie zadeklarowane przy użyciu instrukcji wyliczenia.
Element
Object
.Typ
T
, który ma następujące operatory, gdzieB
jest typem, który może być używany w wyrażeniuBoolean
.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. Należy określić zmienną wyświetlaną w odpowiedniej For
instrukcji.
Wyrażenia start
, end
i step
mogą oceniać dowolny typ danych, który rozszerza typ .counter
Jeśli używasz typu zdefiniowanego przez użytkownika dla counter
programu , może być konieczne zdefiniowanie CType
operatora konwersji w celu przekonwertowania typów start
, end
lub 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ż removeAt
metoda powoduje, że 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ż
Opinia
Prześlij i wyświetl opinię dla