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 语句和数组声明中使用此关键字。 有关数组声明的信息,请参阅 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 后结束。 -.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 语句或 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 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
语句捕获异常。 可以在Finally
块的末尾使用Exit For
。你有一个无限循环,它是一个循环,可以运行大量甚至无限次。 如果检测到此类情况,可以使用
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
时,它会按照 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 语句和本地类型推理。 |
是 | 是 | 是,但仅当现有 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
您可以选择在 Next
语句中指定 counter
变量。 此语法可提高程序的可读性,尤其是在具有嵌套 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