Оператор For... Next (Visual Basic)
Повторяет группу операторов заданное количество раз.
Синтаксис
For counter [ As datatype ] = start To end [ Step step ]
[ statements ]
[ Continue For ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ counter ]
Детали
Часть | Description |
---|---|
counter |
Обязательный в инструкции For . Числовая переменная. Переменная элемента управления для цикла. Дополнительные сведения см . в разделе "Аргумент счетчика" далее в этом разделе. |
datatype |
Необязательно. Тип counter данных . Дополнительные сведения см . в разделе "Аргумент счетчика" далее в этом разделе. |
start |
Обязательный. Числовое выражение. Начальное значение counter . |
end |
Обязательный. Числовое выражение. Окончательное значение counter . |
step |
Необязательно. Числовое выражение. Сумма, по которой counter увеличивается каждый раз через цикл. |
statements |
Необязательно. Один или несколько операторов между For ими Next , выполняющими указанное количество раз. |
Continue For |
Необязательно. Передает управление в следующую итерацию цикла. |
Exit For |
Необязательно. Передает элемент управления из For цикла. |
Next |
Обязательный. Завершает определение For цикла. |
Примечание.
В To
этой инструкции используется ключевое слово для указания диапазона счетчика. Вы также можете использовать этот ключевое слово в списке выбора... Оператор case и в объявлениях массива. Дополнительные сведения о объявлениях массивов см . в инструкции Dim.
Простые примеры
Вы используете структуру For
...Next
, если требуется повторить набор операторов, заданное число раз.
В следующем примере 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
Совет
Некоторое время... Завершение инструкцииили do... Оператор цикла хорошо работает, если заранее не известно, сколько раз выполнять инструкции в цикле. Тем не менее, если вы ожидаете запустить цикл определенное количество раз, 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 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
следующее:
Продолжение итерации является ненужным или невозможным. Ошибочное значение или запрос на завершение может создать это условие.
А
Try
...Catch
...Finally
оператор перехватывает исключение. Вы можете использоватьExit For
в концеFinally
блока.У вас есть бесконечный цикл, который может выполнять большой или даже бесконечное количество раз. При обнаружении такого условия можно использовать
Exit For
для escape-цикла. Дополнительные сведения см. в разделе "Do... Оператор цикла.
Техническая реализация
For
При запуске цикла ...Next
, Visual Basic оценивает start
иend
step
. Visual Basic оценивает эти значения только в это время, а затем назначается start
counter
. Перед запуском блока инструкций Visual Basic сравнивается counter
с end
. Если counter
значение уже больше end
(или меньше, если step
отрицательно), For
цикл заканчивается и элемент управления передается оператору, который следует инструкции Next
. В противном случае блок инструкции выполняется.
Каждый раз, когда Visual Basic сталкивается с операторомNext
, он увеличивается step
counter
и возвращается в инструкцию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
может быть положительным или отрицательным. Этот параметр определяет обработку цикла в соответствии со следующей таблицей:
Значение шага | Цикл выполняется, если |
---|---|
Положительное или нулевое | counter <= end |
Отрицательные | counter >= end |
Значение step
по умолчанию равно 1.
Аргумент счетчика
В следующей таблице указывается, определяет ли counter
новая локальная переменная, которая область в весь For…Next
цикл. Это определение зависит от того, присутствует ли и counter
уже datatype
определена ли она.
Присутствует datatype ли? |
Уже counter определена? |
Результат (определяет ли counter новая локальная переменная, которая область в весь For...Next цикл) |
---|---|---|
No | Да | Нет, так как counter уже определено. Если область counter не является локальным для процедуры, возникает предупреждение во время компиляции. |
No | No | Да. Тип данных выводится из выражений start end и step выражений. Сведения о выводе типов см. в разделе "Оператор вывода параметров" и "Вывод локальных типов". |
Да | Да | Да, но только если существующая counter переменная определена вне процедуры. Эта переменная остается отдельной. Если область существующей counter переменной является локальной процедурой, возникает ошибка во время компиляции. |
Да | Нет | Да. |
Тип counter
данных определяет тип итерации, который должен быть одним из следующих типов:
,
Byte
,SByte
UInteger
Integer
Short
UShort
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
инструкция ...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