Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Powtarza grupę instrukcji, podczas gdy licznik pętli zbliża się do wartości końcowej.
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 Kontrargument w dalszej części tego tematu. |
datatype |
Opcjonalny. Typ danych counter. Aby uzyskać więcej informacji, zobacz Kontrargument w dalszej części tego tematu. |
start |
To jest wymagane. Wyrażenie liczbowe. Początkowa wartość counter. |
end |
To jest wymagane. Wyrażenie liczbowe. Końcowa wartość counter. |
step |
Opcjonalny. Wyrażenie liczbowe. Kwota, o którą counter jest zwiększana przy każdym przejściu 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 |
To jest wymagane. Przerywa definicję For pętli. |
Uwaga / Notatka
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 instrukcji Wybierz... Case i deklaracjach tablic. Aby uzyskać więcej informacji na temat deklaracji tablic, zobacz Dim Statement.
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
Wskazówka
Instrukcja While...End While lub Instrukcja Do...Loop działa dobrze, gdy nie wiesz z góry, 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 For można zagnieżdżać, wstawiając jedną pętlę w drugą. 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 dekrementuje licznik pętli przy 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ą zmienną counter.
Można również zagnieżdżać różne rodzaje struktur sterujących jedna w drugiej. Aby uzyskać więcej informacji, zobacz Zagnieżdżone struktury sterujące.
Przerwij dla i kontynuuj dla
Instrukcja Exit For natychmiast kończy For działanie ...
Next pętla przekazuje sterowanie do instrukcji następującej po instrukcji Next.
Instrukcja Continue For przenosi kontrolkę natychmiast do następnej iteracji pętli. Aby uzyskać więcej informacji, zobacz Instrukcja kontynuacji.
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 ...For
Next pętla. 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 For jest często używany po ocenie jakiegoś warunku (na przykład w strukturze If...Then...Else). Możesz chcieć użyć Exit For w przypadku następujących sytuacji:
Kontynuowanie iteracji jest niepotrzebne lub niemożliwe. Błędna wartość lub żądanie zakończenia może utworzyć ten warunek.
Try...Catch...Finallyinstrukcja przechwytuje wyjątek. Możesz użyćExit Forna końcuFinallybloku.Masz nieskończoną pętlę, która może wykonywać się wiele razy, a nawet w nieskończoność. Jeśli wykryjesz taki warunek, możesz użyć
Exit Fordo przerwania pętli. Aby uzyskać więcej informacji, zobacz Instrukcja Do...Loop.
Implementacja techniczna
Po uruchomieniu For pętli ...Next program Visual Basic oblicza start, end i step. Program Visual Basic ocenia te wartości tylko w tym momencie, a następnie przypisuje start do counter. Przed uruchomieniem bloku instrukcji program Visual Basic porównuje counter z end. Jeśli counter jest już większe niż end (lub mniejsze, jeśli step jest ujemne), pętla For kończy się, a kontrola przechodzi do instrukcji, która następuje po instrukcji Next. W przeciwnym razie blok instrukcji jest uruchamiany.
Za każdym razem, gdy program Visual Basic napotka instrukcję Next, zwiększa counter o step i wraca do instrukcji For. Ponownie porównuje counter z end, a następnie albo uruchamia blok, albo opuszcza pętlę w zależności od wyniku. Ten proces będzie kontynuowany, aż counter przejdzie end lub wystąpi instrukcja 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 wykonać blok, to 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ładający się błąd tylko wtedy, gdy określisz 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 |
| Negatywna |
counter
>= end |
Wartość domyślna step to 1.
Kontrargument
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 wyrażeń start, end i 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 counter określa typ iteracji, który musi być jednym z następujących typów:
A
Byte,SByte,UShort,Short,UInteger,Integer,ULong,Long,Decimal,SinglelubDouble.Wyliczenie zadeklarowane przy użyciu instrukcji Enum.
Jeden
Object.Typ
T, który ma następujące operatory, gdzieBjest typem, który może być używany w wyrażeniuBoolean.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
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ą występującą w odpowiedniej For instrukcji.
Wyrażenia start, end i step mogą przyjąć dowolny typ danych, który rozszerza się do typu counter. Jeśli używasz typu zdefiniowanego przez użytkownika dla counter, 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 instrukcji For Each...Next, przykład przedstawia instrukcję For...Next, iterując 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
Poniższy przykład przechodzi przez wyliczenie zadeklarowane przy użyciu Instrukcji Enum.
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ążone operatory +, -, >= 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