Оператор For... Next (Visual Basic)
Повторяет группу операторов заданное количество раз.
Синтаксис
For counter [ As datatype ] = start To end [ Step step ]
[ statements ]
[ Continue For ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ counter ]
Компоненты
Часть | Описание |
---|---|
counter |
Требуется в инструкции For . Числовая переменная. Переменная элемента управления для цикла. Дополнительные сведения см. далее в разделе "Аргумент счетчика ". |
datatype |
Необязательный элемент. Тип counter данных . Дополнительные сведения см. далее в разделе "Аргумент счетчика ". |
start |
Обязательный. Числовое выражение. Начальное значение counter . |
end |
Обязательный. Числовое выражение. Конечное значение counter . |
step |
Необязательный элемент. Числовое выражение. Сумма, по которой counter увеличивается каждый раз через цикл. |
statements |
Необязательный элемент. Одна или несколько инструкций между For и Next выполнением указанного количества раз. |
Continue For |
Необязательный элемент. Передает управление в следующую итерацию цикла. |
Exit For |
Необязательный элемент. Передает элемент управления из For цикла. |
Next |
Обязательный. Завершает определение For цикла. |
Примечание
Ключевое To
слово используется в этом операторе для указания диапазона счетчика. Вы также можете использовать это ключевое слово в разделе Select... Оператор Case и в объявлениях массива. Дополнительные сведения об объявлениях массивов см. в инструкции Dim.
Простые примеры
Структура ...Next
используетсяFor
, если требуется повторить набор инструкций, заданное число раз.
В следующем примере index
переменная начинается со значения 1 и увеличивается с каждой итерации цикла, заканчивающейся после достижения значения index
5.
For index As Integer = 1 To 5
Debug.Write(index.ToString & " ")
Next
Debug.WriteLine("")
' Output: 1 2 3 4 5
В следующем примере number
переменная начинается с 2 и уменьшается на 0,25 для каждой итерации цикла, заканчивающейся после достижения значения number
0. Аргумент Step
-.25
уменьшает значение на 0,25 для каждой итерации цикла.
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
Совет
Некоторое время... Завершить оператор While или Do... Loop оператор работает хорошо, если вы не знаете заранее, сколько раз для выполнения инструкций в цикле. Тем не менее, если вы ожидаете запустить цикл определенное количество раз, For
цикл ...Next
является лучшим выбором. Количество итераций определяется при первом вводе цикла.
Вложенные циклы
Вы можете вложить For
циклы, поместив один цикл в другой. В следующем примере показаны вложенные For
структуры...Next
с разными значениями шага. Внешний цикл создает строку для каждой итерации цикла. Внутренний цикл уменьшает переменную счетчика цикла для каждой итерации цикла.
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
При вложенных циклах каждый цикл должен иметь уникальную counter
переменную.
Можно также вложить различные структуры управления типами в другую. Дополнительные сведения см. в разделе "Вложенные структуры управления".
Выход и продолжение для
Оператор Exit For
немедленно выходит из For
...Next
цикл и передача элемента управления оператору, следующему за оператором Next
.
Оператор Continue For
передает управление непосредственно в следующую итерацию цикла. Дополнительные сведения см. в инструкции Continue.
В следующем примере показано использование инструкций Continue For
и 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
Вы можете поместить любое количество Exit For
операторов в ...For
Next
Цикл. При использовании вложенной For
...Next
циклы, Exit For
выход из самого внутреннего цикла и передача управления на следующий более высокий уровень вложенности.
Exit For
часто используется после оценки какого-то условия (например, в If
...Then
...Else
структура). Может потребоваться использовать Exit For
следующие условия:
Продолжение итерации является ненужным или невозможным. Ошибочное значение или запрос на завершение может создать это условие.
A
Try
...Catch
...Finally
оператор перехватывает исключение. Вы можете использоватьExit For
в концеFinally
блока.У вас есть бесконечный цикл, который может выполнять большой или даже бесконечное количество раз. При обнаружении такого условия можно использовать для
Exit For
экранирования цикла. Дополнительные сведения см. в разделе "Do... оператор Loop.
Техническая реализация
For
При запуске цикла ...Next
Visual Basic вычисляет start
и end
step
. Visual Basic оценивает эти значения только в это время, а затем назначается start
counter
. Перед запуском блока инструкций Visual Basic сравнивается counter
с end
. Если counter
значение уже больше end
(или меньше, если step
отрицательное), For
цикл заканчивается и элемент управления передается оператору, который следует за оператором Next
. В противном случае выполняется блок инструкции.
Каждый раз, когда Visual Basic встречает инструкциюNext
, она увеличивается counter
step
и возвращается в инструкциюFor
. Снова он сравнивается counter
с end
и снова запускает блок или завершает цикл в зависимости от результата. Этот процесс продолжается до тех пор, пока не counter
будет end
пройдено или Exit For
не будет обнаружена инструкция.
Цикл не останавливается до тех пор, пока не counter
пройдет.end
Если counter
равно end
, цикл продолжается. Сравнение, определяющее, следует ли запускать блок counter
<= end
если step
является положительным и counter
>= end
если step
является отрицательным.
Если изменить значение counter
в цикле, код может оказаться более трудным для чтения и отладки. Изменение значения start
, end
или step
не влияет на значения итерации, которые были определены при первом вводе цикла.
Если вы вложены циклы, компилятор сигнализирует об ошибке, если он обнаруживает Next
оператор внешнего уровня вложения перед Next
оператором внутреннего уровня. Однако компилятор может обнаружить эту перекрывающиеся ошибки только в том случае, если указано counter
в каждой Next
инструкции.
Аргумент шага
Значение step
может быть положительным или отрицательным. Этот параметр определяет обработку цикла в соответствии со следующей таблицей:
Значение шага | Loop выполняется, если |
---|---|
Положительное или нулевое значение | counter <= end |
Отрицательное число | counter >= end |
Значение step
по умолчанию — 1.
Аргумент счетчика
В следующей таблице показано, определяет ли counter
новая локальная переменная, ограниченная всем For…Next
циклом. Это определение зависит от наличия datatype
и от того, определена ли counter
она.
Присутствует?datatype |
Уже counter определен? |
Результат (определяет ли counter новая локальная переменная, ограниченная всем For...Next циклом). |
---|---|---|
Нет | Да | Нет, так как counter уже определено. Если область counter действия не является локальной для процедуры, возникает предупреждение во время компиляции. |
Нет | Нет | Да. Тип данных выводится из выражений start end и step выражений. Дополнительные сведения о выводе типов см. в инструкции option Infer и локальном выводе типов. |
Да | Да | Да, но только если существующая counter переменная определена вне процедуры. Эта переменная остается отдельной. Если область существующей counter переменной является локальной для процедуры, возникает ошибка во время компиляции. |
Да | Нет | Да. |
Тип counter
данных определяет тип итерации, который должен быть одним из следующих типов:
A
Byte
, ,UShort
Integer
UInteger
Short
SByte
Long
Decimal
ULong
,Single
или .Double
Перечисление, которое объявляется с помощью оператора Перечисления.
Объект
Object
.Тип
T
со следующими операторами, гдеB
это тип, который можно использовать в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
При необходимости можно указать counter
переменную в инструкции Next
. Этот синтаксис улучшает удобочитаемость программы, особенно если у вас есть вложенные For
циклы. Необходимо указать переменную, которая отображается в соответствующей For
инструкции.
Выражения start
и step
выражения могут вычислить любой тип данных, расширяющийся до типа counter
. end
При использовании определяемого пользователем типа counter
может потребоваться определить CType
оператор преобразования для преобразования типов start
, end
или step
в тип counter
.
Пример 1
В следующем примере удаляются все элементы из универсального списка. Вместо for Each... В следующем операторе показан оператор For
...Next
, который выполняет итерирование в порядке убывания. В примере используется этот метод, так как метод приводит к тому, что removeAt
элементы после удаления элемента имеют более низкое значение индекса.
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
Пример 2
В следующем примере выполняется итерирование перечисления, объявленного с помощью оператора 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
Пример 3
В следующем примере параметры инструкции используют класс, имеющий перегрузки операторов для +
операторов , -
>=
и <=
операторов.
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