Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Повторяет выполнение группы операторов, пока счетчик цикла не достигнет окончательного значения.
Синтаксис
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.
Простые примеры
Вы используете структуру 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
Подсказка
Инструкция While...End 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
переменную.
Можно также вкладывать различные типы управляющих структур друг в друга. Дополнительные сведения см. в разделе "Вложенные структуры управления".
Выход из цикла For и продолжение цикла For
Оператор 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
, чтобы выйти из цикла. Дополнительные сведения см. в инструкции Do...Loop Statement.
Техническая реализация
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
может быть положительным или отрицательным. Этот параметр определяет обработку цикла в соответствии со следующей таблицей:
Значение шага | Цикл выполняется, если |
---|---|
Положительное или нулевое |
counter
<= end |
Отрицательные |
counter
>= end |
Значение по умолчанию step
равно 1.
Контраргумент
В следующей таблице показано, определяет ли counter
новую локальную переменную с областью видимости во всем цикле For…Next
. Это определение зависит от того, присутствует ли datatype
и определен ли уже counter
.
datatype присутствует? |
Уже ли counter определено? |
Результат (определяет ли counter наличие новой локальной переменной, охватываемой всем циклом For...Next ) |
---|---|---|
нет | Да | Нет, так как counter уже определено. Если область counter действия не является локальной для процедуры, возникает предупреждение во время компиляции. |
нет | нет | Да. Тип данных определяется из выражений start , end и step . Сведения о выводе типов см. в разделе "Оператор вывода параметров" и "Вывод локальных типов". |
Да | Да | Да, но только если существующая counter переменная определена вне процедуры. Эта переменная остается отдельной. Если область существующей counter переменной является локальной для процедуры, возникает ошибка во время компиляции. |
Да | нет | Да. |
Тип counter
данных определяет тип итерации, который должен быть одним из следующих типов:
А,
Byte
,SByte
,UShort
,Short
,UInteger
,Integer
,ULong
,Long
,Decimal
,Single
илиDouble
.Перечисление, которое объявляется с помощью оператора Enum.
Объект
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
, end
и step
могут оцениваться в любой тип данных, который расширяется до типа counter
. Если вы используете определяемый пользователем тип counter
, может потребоваться определить оператор преобразования CType
для преобразования типов start
, end
или step
в тип counter
.
Пример 1
В следующем примере удаляются все элементы из универсального списка. Вместо оператора For Each...Next в примере показан оператор 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