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 语句 (Visual Basic) 和在数组声明。有关数组声明的更多信息,请参见 Dim 语句 (Visual Basic)

简单示例

如果要重复组语句设定的次数时,可以使用一 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 后的值。 -.25 的 Step 参数减少该值按 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 语句 (Visual Basic)Do...Loop 语句 (Visual Basic) 适用,当您事先不知道多少次运行在循环中的语句。但是,如果您希望让循环运行特定次数,则 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 变量。

您还可以将多个不同类型的控制结构相互进行嵌套。 有关更多信息,请参见嵌套的控件结构 (Visual Basic)

退出并继续为

Exit For 语句立即退出 For…Next 循环和将控件传输到遵循 Next 条语句。

Continue For 语句将控制权立即转移给下一轮循环。 有关更多信息,请参见Continue 语句 (Visual Basic)

下面的示例阐释了 Continue For and Exit For 语句的用法。

For index As Integer = 1 To 100000
    ' If index is between 5 and 7, continue 
    ' with the next iteration. 
    If index >= 5 And 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

可以在 For…Next 循环中放置任意数量的 Exit For 语句。 当在嵌套的 For…Next 循环内使用时,Exit For 将退出最内层的循环,并将控制权交给下一层较高级别的嵌套。

Exit For 是通常,在计算某种情况后 (例如,在 If…Then…Else 结构)。 您可能希望针对下列条件使用 Exit For:

  • 继续循环不必要或不可能。 一个不正确的值或停止请求可创建此条件。

  • Try…Catch…Finally 语句捕捉异常。 可以在 Finally 块的末尾使用 Exit For。

  • 有无限循环,该循环可以运行甚至不用次数。 如果检测到这样的条件,就可以使用 Exit For 退出循环。 有关更多信息,请参见Do...Loop 语句 (Visual Basic)

技术实现

当 For...Next 循环开始时,Visual Basic 将计算 start、end 和 step。 Visual Basic 目前仅计算这些值然后将 start 到 counter。 在语句块运行,Visual Basic 与 end之前比较 counter。 如果 counter 大于 end 值已为 (或更小,如果 step 为负),For 循环结束,并且控制传递到遵循 Next 条语句。 否则,该语句块运行。

每次 Visual Basic 遇到 Next 语句时,都按 step 递增 counter,然后返回到 For 语句。 它再次将 counter 与 end 进行比较,并再次根据结果运行块或者退出循环。 这一过程将一直持续下去,直到 counter 传递 end 或者遇到 Exit For 语句为止。

循环不会停止,直到 counter 已通过 end。 如果 counter 等于 end,则循环继续。 如果 step 为正数,确定是否运行循环代码块的比较运算将为 counter <= end;如果 step 为负数,则为 counter >= end。

如果更改 counter 的值,在循环内时,您的代码可能会难以阅读和调试。 更改 start的值,end或 step 不影响确定的迭代值,当循环先输入了。

如果嵌套循环,编译器发出错误信号,如果它在内部级别的 Next 语句之前遇到了外部嵌套级别的 Next 语句。 不过,仅当在所有 Next 语句中都指定了 counter 时,编译器才能检测到这种重叠错误。

步骤参数

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 语句局部类型推理 (Visual Basic)

是,但,只有 + 当现有 counter 变量在过程外定义。 该变量保留单独的。 如果现有 counter 变量的范围是本地传递给过程,将产生编译时错误。

是的。

counter 的数据类型确定迭代的类型,必须为下列类型之一:

  • Byte、SByte、UShort、Short、UInteger、Integer、ULong、Long、Decimal、Single 或 Double。

  • 您使用 Enum 语句 (Visual Basic) 声明的枚举。

  • 一个 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

在 Next 语句可以选择指定 counter 变量。 尤其是如果嵌套 For 循环,此语法以提高程序的可读性。 您必须指定出现在相应的 For 语句中的变量。

start、end 和 step 表达式可以计算为拓宽到 counter 类型的任何数据类型。 如果为 counter使用用户定义的类型时,您可能必须定义 CType 转换运算符将 start、end或 step 的类型转换为 counter的类型。

示例

下面的示例从泛型列表中删除所有元素。 而不是 For Each...Next 语句 (Visual Basic),该示例显示按降序重复一个 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

下面的示例通过使用 Enum 语句 (Visual Basic),声明的循环访问枚举。

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

在下面的示例中,语句参数使用了具有 +、 -、>= 和 <= 运算符的运算符重载的类。

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

请参见

参考

While...End While 语句 (Visual Basic)

Do...Loop 语句 (Visual Basic)

Exit 语句 (Visual Basic)

List

概念

循环结构 (Visual Basic)

嵌套的控件结构 (Visual Basic)

其他资源

集合(C# 和 Visual Basic)