• Статья
  • Чтение занимает 4 мин

Повторяет группу инструкций указанное число раз.

Синтаксис

For counter [ As datatype ] = start To end [ Step step ]
    [ statements ]
    [ Continue For ]
    [ statements ]
    [ Exit For ]
    [ statements ]
Next [ counter ]

Компоненты

Часть Описание
counter Требуется в For инструкции. Числовая переменная. Управляющая переменная для цикла. Дополнительные сведения см. в подразделе аргумент Counter далее в этой статье.
datatype Необязательный элемент. Тип данных counter . Дополнительные сведения см. в подразделе аргумент 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 или 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Оператор немедленно завершает работу ForNext выполняет цикл и передает управление оператору, который следует за 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 повторить. При использовании внутри вложенного ForNext выполняет цикл, Exit For выходит из внутреннего цикла и передает управление следующему более высокому уровню вложенности.

Exit For часто используется после вычисления некоторого условия (например, в IfThenElse структура). Может потребоваться использовать Exit For для следующих условий:

  • Продолжение итерации не требуется или невозможно. Это условие может быть создано с помощью ошибочного значения или запроса на завершение.

  • А.. Try . CatchFinally перехватывает исключение. 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

Значение step может быть либо положительным, либо отрицательным. Этот параметр определяет обработку цикла в соответствии со следующей таблицей.

Значение шага Цикл выполняется, если
Положительный или нулевой 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 , 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

В следующем примере удаляются все элементы из универсального списка. Вместо a для каждого… Следующий оператор. в примере показана 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

См. также

  • List<T>
  • Циклические структуры
  • Оператор While…End While
  • Оператор Do…Loop
  • Вложенные структуры управления
  • Оператор Exit
  • Коллекции