Оператор 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 операторов в ...ForNext Цикл. При использовании вложенной 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и endstep. Visual Basic оценивает эти значения только в это время, а затем назначается startcounter. Перед запуском блока инструкций Visual Basic сравнивается counter с end. Если counter значение уже больше end (или меньше, если step отрицательное), For цикл заканчивается и элемент управления передается оператору, который следует за оператором Next . В противном случае выполняется блок инструкции.

Каждый раз, когда Visual Basic встречает инструкциюNext, она увеличивается counterstep и возвращается в инструкцию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 действия не является локальной для процедуры, возникает предупреждение во время компиляции.
Нет Нет Да. Тип данных выводится из выражений startendи step выражений. Дополнительные сведения о выводе типов см. в инструкции option Infer и локальном выводе типов.
Да Да Да, но только если существующая counter переменная определена вне процедуры. Эта переменная остается отдельной. Если область существующей counter переменной является локальной для процедуры, возникает ошибка во время компиляции.
Да Нет Да.

Тип counter данных определяет тип итерации, который должен быть одним из следующих типов:

  • AByte, , UShortIntegerUIntegerShortSByteLongDecimalULong, 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

См. также раздел