Do...Loop 语句 (Visual Basic)
更新:2007 年 11 月
当某个 Boolean 条件为 True 时,或在该条件变为 True 之前,重复执行某个语句块。
Do { While | Until } condition
[ statements ]
[ Exit Do ]
[ statements ]
Loop
-or-
Do
[ statements ]
[ Exit Do ]
[ statements ]
Loop { While | Until } condition
各部分说明
While
必选项(除非使用了 Until)。重复执行循环,直到 condition 为 False。Until
必选项(除非使用了 While)。重复执行循环,直到 condition 为 True。condition
可选项。Boolean 表达式。如果 condition 为 Nothing,Visual Basic 会将其视为 False。statements
可选项。一条或多条语句,它们在 condition 为 True 时或变为 True 之前重复执行。Exit Do
可选项。将控制传送到 Do 循环外。Loop
必选。终止 Do 循环的定义。
备注
如果想重复执行一组语句不定的次数,直到满足了某个条件为止,则可使用 Do...Loop 结构。如果想重复执行语句既定的次数,则 For...Next 语句通常是更好的选择。
Do...Loop 结构在灵活性上比 While...End While 语句 (Visual Basic) 更强,这是因为,它允许您在 condition 停止为 True 或初次变为 True 时选择是否结束循环。它还允许您在循环的开头或结尾测试 condition。
规则
**条件的性质。**条件通常通过两个值的比较得到,但也可以是任何计算为 Boolean 数据类型 (Visual Basic) 值(True 或 False)的表达式。这包括已转换为 Boolean 的其他数据类型(如数字类型)的值。
**测试条件。**只能在循环的开头或结尾测试 condition 一次。可以使用 While 或 Until 来指定 condition,但不能同时使用两个。
**迭代次数。**如果在循环的开头(在 Do 语句中)测试 condition,则循环可能从不会运行一次。如果在循环的结尾(在 Loop 语句中)进行测试,则循环总是会运行至少一次。
**嵌套循环。**可以将一个 Do 循环放在另一个同类循环内以嵌套该循环。也可以互相嵌套不同类型的控制结构。有关更多信息,请参见嵌套的控制结构。
传送到循环外。Exit 语句 (Visual Basic) 将控制立即传送给 Loop 语句后面的语句。如果检测到使继续迭代不必要或不可能的条件(如错误值或终止请求),则可能需要退出循环。可以在 Do 循环内的任何地方放入任意数量的 Exit Do 语句。通常会在计算某个条件的值后使用 Exit Do,例如在 If...Then...Else 结构中。
无限循环
Exit Do 的一种用途是测试能够导致无限循环(即运行次数非常多甚至无限的循环)的条件。如果检测到此类条件,则可以使用 Exit Do 来跳出循环。否则,循环会继续执行。
在下面的示例中,number 被赋予一个可以导致循环的执行次数超过 2 ^ 31 次的值。If 语句会检查此条件,如果它存在,则退出,从而防止无限循环。
Sub exitDoExample()
Dim counter As Integer = 0
Dim number As Integer = 8
Do Until number = 10
If number <= 0 Then Exit Do
number -= 1
counter += 1
Loop
MsgBox("The loop ran " & counter & " times.")
End Sub
说明: |
---|
要停止无限循环,请按 Esc 或 Ctrl+Break。 |
示例
下面的示例阐释嵌套的 Do...Loop 结构,While 和 Until 的用法,以及在循环的开头(Do 语句)和结尾(Loop 语句)进行的测试。
Sub DoExample()
Dim check As Boolean = True
Dim counter As Integer = 0
Do
Do While counter < 20
counter += 1
If counter = 10 Then
check = False
Exit Do
End If
Loop
Loop Until check = False
End Sub
在前面的示例中,内层的 Do...Loop 结构循环 10 次,将标志值设置为 False,并使用 Exit Do 语句提前退出循环。外层循环则在检查标志值后立即退出。