Оператор For... Next (Visual Basic)For...Next Statement (Visual Basic)

Повторяет группу инструкций указанное число раз.Repeats a group of statements a specified number of times.

СинтаксисSyntax

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

КомпонентыParts

ОтделениеPart ОписаниеDescription
counter Требуется в For инструкции.Required in the For statement. Числовая переменная.Numeric variable. Управляющая переменная для цикла.The control variable for the loop. Дополнительные сведения см. в подразделе аргумент Counter далее в этой статье.For more information, see Counter Argument later in this topic.
datatype Необязательный элемент.Optional. Тип данных counter .Data type of counter. Дополнительные сведения см. в подразделе аргумент Counter далее в этой статье.For more information, see Counter Argument later in this topic.
start Обязательный.Required. Числовое выражение.Numeric expression. Начальное значение counter.The initial value of counter.
end Обязательный.Required. Числовое выражение.Numeric expression. Конечное значение counter .The final value of counter.
step Необязательный элемент.Optional. Числовое выражение.Numeric expression. Величина, на которую counter увеличивается каждый раз с помощью цикла.The amount by which counter is incremented each time through the loop.
statements Необязательный элемент.Optional. Одна или несколько инструкций между For и Next выполняются указанное число раз.One or more statements between For and Next that run the specified number of times.
Continue For Необязательный элемент.Optional. Передает управление в следующую итерацию цикла.Transfers control to the next loop iteration.
Exit For Необязательный элемент.Optional. Передает управление за пределы For цикла.Transfers control out of the For loop.
Next Обязательный элемент.Required. Завершает определение For цикла.Terminates the definition of the For loop.

Примечание

ToКлючевое слово используется в этом операторе для указания диапазона счетчика.The To keyword is used in this statement to specify the range for the counter. Это ключевое слово также можно использовать в SELECT... Оператор Case и в объявлениях массивов.You can also use this keyword in the Select...Case Statement and in array declarations. Дополнительные сведения об объявлениях массивов см. в разделе оператор Dim.For more information about array declarations, see Dim Statement.

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

Используйте For структуру..., Next Если нужно повторить набор инструкций заданное число раз.You use a For...Next structure when you want to repeat a set of statements a set number of times.

В следующем примере index переменная начинается со значения 1 и увеличивается при каждой итерации цикла, после чего значение index достигает 5.In the following example, the index variable starts with a value of 1 and is incremented with each iteration of the loop, ending after the value of index reaches 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.In the following example, the number variable starts at 2 and is reduced by 0.25 on each iteration of the loop, ending after the value of number reaches 0. StepАргумент класса -.25 сокращает значение на 0,25 при каждой итерации цикла.The Step argument of -.25 reduces the value by 0.25 on each iteration of the loop.

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 хорошо работает, если заранее неизвестно, сколько раз нужно выполнять инструкции в цикле.A While...End While Statement or Do...Loop Statement works well when you don't know in advance how many times to run the statements in the loop. Однако, если вы планируете выполнять цикл определенное число раз, For Next лучше выбрать цикл....However, when you expect to run the loop a specific number of times, a For...Next loop is a better choice. Число итераций определяется при первом входе в цикл.You determine the number of iterations when you first enter the loop.

Вложенные циклыNesting Loops

Можно вложить For циклы, поместив один цикл в другой.You can nest For loops by putting one loop within another. В следующем примере показаны вложенные For структуры... Next , имеющие разные значения шага.The following example demonstrates nested For...Next structures that have different step values. Внешний цикл создает строку для каждой итерации цикла.The outer loop creates a string for every iteration of the loop. Внутренний цикл уменьшает переменную счетчика цикла для каждой итерации цикла.The inner loop decrements a loop counter variable for every iteration of the loop.

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 переменную.When nesting loops, each loop must have a unique counter variable.

Вы также можете вкладывать различные виды управления в друг друга.You can also nest different kinds control structures within each other. Дополнительные сведения см. в разделе вложенные структуры управления.For more information, see Nested Control Structures.

Выход и продолжение дляExit For and Continue For

Exit ForОператор немедленно завершает работу For ...NextThe Exit For statement immediately exits the ForNext выполняет цикл и передает управление оператору, который следует за Next оператором.loop and transfers control to the statement that follows the Next statement.

Continue ForОператор передает управление сразу в следующую итерацию цикла.The Continue For statement transfers control immediately to the next iteration of the loop. Дополнительные сведения см. в разделе оператор continue.For more information, see Continue Statement.

В следующем примере показано использование Continue For Exit For операторов и.The following example illustrates the use of the Continue For and Exit For statements.

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 ...NextYou can put any number of Exit For statements in a ForNext повторить.loop. При использовании внутри вложенного For ...NextWhen used within nested ForNext выполняет цикл, Exit For выходит из внутреннего цикла и передает управление следующему более высокому уровню вложенности.loops, Exit For exits the innermost loop and transfers control to the next higher level of nesting.

Exit For часто используется после вычисления некоторого условия (например, в If ... Then ...Else структура).Exit For is often used after you evaluate some condition (for example, in an If...Then...Else structure). Может потребоваться использовать Exit For для следующих условий:You might want to use Exit For for the following conditions:

  • Продолжение итерации не требуется или невозможно.Continuing to iterate is unnecessary or impossible. Это условие может быть создано с помощью ошибочного значения или запроса на завершение.An erroneous value or a termination request might create this condition.

  • А.. Try . Catch ...Finally перехватывает исключение.A Try...Catch...Finally statement catches an exception. Exit ForВ конце блока можно использовать Finally .You might use Exit For at the end of the Finally block.

  • У вас есть бесконечный цикл, который может выполняться с большим или даже бесконечным числом раз.You have an endless loop, which is a loop that could run a large or even infinite number of times. При обнаружении такого условия можно использовать Exit For для экранирования цикла.If you detect such a condition, you can use Exit For to escape the loop. Дополнительные сведения см. в разделе Do... Loop, инструкция.For more information, see Do...Loop Statement.

Техническая реализацияTechnical Implementation

При For запуске цикла... Next Visual Basic вычисляет start , end и step .When a For...Next loop starts, Visual Basic evaluates start, end, and step. Visual Basic вычисляет эти значения только в данный момент, а затем присваивает значение start counter .Visual Basic evaluates these values only at this time and then assigns start to counter. Перед выполнением блока операторов Visual Basic сравнивается counter с end .Before the statement block runs, Visual Basic compares counter to end. Если counter уже больше end значения (или меньше step , если имеет отрицательное значение), For цикл завершается, и управление передается оператору, следующему за Next оператором.If counter is already larger than the end value (or smaller if step is negative), the For loop ends and control passes to the statement that follows the Next statement. В противном случае выполняется блок операторов.Otherwise, the statement block runs.

Каждый раз, когда Visual Basic обнаруживает Next оператор, он увеличивается на counter step и возвращается в For оператор.Each time Visual Basic encounters the Next statement, it increments counter by step and returns to the For statement. Затем он сравнивает counter с end и снова либо выполняет блок, либо выходит из цикла, в зависимости от результата.Again it compares counter to end, and again it either runs the block or exits the loop, depending on the result. Этот процесс выполняется до тех пор counter , пока не будет пройден end или Exit For не встретится оператор.This process continues until counter passes end or an Exit For statement is encountered.

Цикл не останавливается, пока не будет counter пройден end .The loop doesn't stop until counter has passed end. Если counter равно end , цикл продолжится.If counter is equal to end, the loop continues. Сравнение, которое определяет, следует ли запускать блок, counter <= end Если step является положительным и counter >= end step отрицательным.The comparison that determines whether to run the block is counter <= end if step is positive and counter >= end if step is negative.

Если изменить значение counter во время цикла, код может оказаться труднее для чтения и отладки.If you change the value of counter while inside a loop, your code might be more difficult to read and debug. Изменение значения start , end или step не влияет на значения итерации, которые были определены при первом входе в цикл.Changing the value of start, end, or step doesn't affect the iteration values that were determined when the loop was first entered.

При вложении циклов компилятор сообщает об ошибке, если обнаруживает Next оператор внешнего уровня вложенности перед Next инструкцией внутреннего уровня.If you nest loops, the compiler signals an error if it encounters the Next statement of an outer nesting level before the Next statement of an inner level. Однако компилятор может обнаружить эту перекрытие ошибки только в том случае, если указать counter в каждой Next инструкции.However, the compiler can detect this overlapping error only if you specify counter in every Next statement.

Аргумент StepStep Argument

Значение step может быть либо положительным, либо отрицательным.The value of step can be either positive or negative. Этот параметр определяет обработку цикла в соответствии со следующей таблицей.This parameter determines loop processing according to the following table:

Значение шагаStep value Цикл выполняется, еслиLoop executes if
Положительный или нулевойPositive or zero counter <= end
Отрицательное числоNegative counter >= end

Значение step по умолчанию — 1.The default value of step is 1.

Аргумент счетчикаCounter Argument

В следующей таблице показано counter , определяет ли новая локальная переменная, областью действия которой является весь For…Next цикл.The following table indicates whether counter defines a new local variable that’s scoped to the entire For…Next loop. Это определение зависит от того, существует ли оно datatype и counter уже определено ли оно.This determination depends on whether datatype is present and whether counter is already defined.

datatypeИмеется?Is datatype present? counterУже определено?Is counter already defined? Результат ( counter определяет, определена ли новая локальная переменная в пределах всего For...Next цикла)Result (whether counter defines a new local variable that’s scoped to the entire For...Next loop)
НетNo ДаYes Нет, так как counter уже определено.No, because counter is already defined. Если область действия counter не является локальной для процедуры, возникает предупреждение во время компиляции.If the scope of counter isn't local to the procedure, a compile-time warning occurs.
НетNo НетNo Да.Yes. Тип данных выводится из start end выражений, и step .The data type is inferred from the start, end, and step expressions. Дополнительные сведения о выводе типа см. в разделе Option Infer и определение локального типа.For information about type inference, see Option Infer Statement and Local Type Inference.
ДаYes ДаYes Да, но только в том случае, если существующая counter переменная определена за пределами процедуры.Yes, but only if the existing counter variable is defined outside the procedure. Эта переменная остается отдельной.That variable remains separate. Если область существующей counter переменной является локальной для процедуры, возникает ошибка времени компиляции.If the scope of the existing counter variable is local to the procedure, a compile-time error occurs.
ДаYes НетNo Да.Yes.

Тип данных параметра counter определяет тип итерации, который должен быть одним из следующих типов:The data type of counter determines the type of the iteration, which must be one of the following types:

  • A Byte , SByte , UShort , Short , UInteger , Integer , ULong , Long , Decimal , Single или Double .A Byte, SByte, UShort, Short, UInteger, Integer, ULong, Long, Decimal, Single, or Double.

  • Перечисление, объявляемое с помощью инструкции enum.An enumeration that you declare by using an Enum Statement.

  • Объект Object.An Object.

  • Тип T , имеющий следующие операторы, где B — это тип, который можно использовать в Boolean выражении.A type T that has the following operators, where B is a type that can be used in a Boolean expression.

    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 инструкции.You can optionally specify the counter variable in the Next statement. Этот синтаксис повышает удобочитаемость программы, особенно при наличии вложенных For циклов.This syntax improves the readability of your program, especially if you have nested For loops. Необходимо указать переменную, которая отображается в соответствующем For операторе.You must specify the variable that appears in the corresponding For statement.

startВыражения, end и step могут иметь любой тип данных, который расширяется до типа counter .The start, end, and step expressions can evaluate to any data type that widens to the type of counter. При использовании определяемого пользователем типа для может потребоваться counter определить CType оператор преобразования для преобразования типов start , end или step в тип counter .If you use a user-defined type for counter, you might have to define the CType conversion operator to convert the types of start, end, or step to the type of counter.

ПримерExample

В следующем примере удаляются все элементы из универсального списка.The following example removes all elements from a generic list. Вместо a для каждого... Следующий оператор. в примере показана For инструкция... Next , которая выполняет итерацию в убывающем порядке.Instead of a For Each...Next Statement, the example shows a For...Next statement that iterates in descending order. В этом примере используется этот метод removeAt , поскольку метод заставляет элементы после удаленного элемента иметь меньшее значение индекса.The example uses this technique because the removeAt method causes elements after the removed element to have a lower index value.

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

ПримерExample

В следующем примере перебирается перечисление, объявленное с помощью инструкции enum.The following example iterates through an enumeration that's declared by using an Enum Statement.

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

ПримерExample

В следующем примере параметры инструкции используют класс, который содержит перегрузки операторов для + операторов,, - >= и <= .In the following example, the statement parameters use a class that has operator overloads for the +, -, >=, and <= operators.

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

См. такжеSee also