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 可选。 在 ForNext 之间运行指定次数的一个或多个语句。
Continue For 可选。 将控制转移到下一个循环迭代。
Exit For 可选。 将控制转移到 For 循环外。
Next 必需。 终止 For 循环的定义。

注意

此语句中使用 To 关键字来指定计数器的范围。 还可以在 Select...Case 语句和数组声明中使用此关键字。 有关数组声明的信息,请参阅 Dim Statement

简单示例

若要多次重复一组语句,请使用 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 后结束。 -.25Step 参数在循环每次迭代时将值减少 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 循环是更好的选择。 首次输入循环时,可确定迭代次数。

嵌套循环

可以通过将 1 个循环放入另一个循环来嵌套 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 语句

下面的示例阐释了 Continue ForExit 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 语句捕获异常。 可以在 Finally 块的末尾使用 Exit For

  • 你有一个无限循环,它是一个循环,可以运行大量甚至无限次。 如果检测到此类情况,可以使用 Exit For 对循环进行转义。 有关详细信息,请参阅 Do...Loop 语句

技术实现

For...Next 循环启动时,Visual Basic 计算 startendstep。 Visual Basic 此次只计算这些值,然后将 start 分配给 counter。 在语句块运行之前,Visual Basic 将 counterend 比较。 如果 counter 已大于 end(或者小于,如果 step 为负值),For 循环结束,控件将传递给 Next 语句后的语句。 否则,语句块将运行。

每次 Visual Basic 遇见语句 Next 时,它会按照 step 递增 counter 并且返回到 For 语句。 同样,它会将 counterend 进行比较,并再次运行块或退出循环,具体取决于结果。 此过程将继续,直到 counter 传递end,或者遇到 Exit For 语句。

循环在 counter 传递 end 之前不会停止。 如果 counter 等于 end,则循环继续。 如果 step 为正,则确定是否运行块的比较结果为 counter<= end;如果 step 为负,则比较结果为 counter>= end

如果在循环内更改 counter 的值,则代码可能更难读取和调试。 更改 startendstep 的值不会影响首次输入循环时确定的迭代值。

如果嵌套循环,则编译器在内部级别的 Next 语句之前遇到外部嵌套级别的 Next 语句时,会发出错误信号。 但是,只有在每个 Next 语句中指定 counter 时,编译器才能检测此重叠错误。

Step 参数

step 的值可以为正,也可以为负。 此参数根据下表确定循环处理:

步骤值 如果,则循环执行
正数或零 counter<= end
负数 counter>= end

step 的默认值为 1。

反参数

下表指示是否 counter 定义范围为 For…Next 整个循环的新局部变量。 此确定取决于 datatype 是否存在以及是否 counter 已定义。

datatype 是否存在? counter 是否已经定义? 结果 (是否 counter 定义了作用域为整个 For...Next 循环的新局部变量)
不是,因为 counter 已定义。 如果该过程的作用域 counter 不是本地的,则会发生编译时警告。
是的。 数据类型是从 startendstep 表达式中推断出来的。 有关类型推理的详细信息,请参阅 Option Infer 语句本地类型推理
是,但仅当现有 counter 变量在过程外定义时才存在。 该变量保持独立。 如果现有 counter 变量的作用域是过程的本地值,则会发生编译时错误。
是的。

counter 的数据类型确定迭代的类型,该类型必须是以下类型之一:

  • 一个 ByteSByteUShortShortUIntegerIntegerULongLongDecimalSingleDouble

  • 使用 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

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

startendstep 表达式的计算结果可以是扩大到类型 counter 的任何数据类型。 如果对 counter 使用用户定义的类型,则可能需要定义 CType 转换运算符,以将 startendstep 的类型转换为类型 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

另请参阅