Поделиться через


Для... Следующая инструкция (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.

Простые примеры

Вы используете структуру 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иendstep. 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

См. также