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

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

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

  • , Byte, SByteUIntegerIntegerShortUShortLongDecimalULongSingleили .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или endstep в тип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

См. также