Do...Loop 语句 (Visual Basic)

当某个 Boolean 条件为 True 时,或在该条件变为 True 之前,重复执行某个语句块。

Do { While | Until } condition
    [ statements ]
    [ Exit Do ]
    [ statements ]
Loop
-or-
Do
    [ statements ]
    [ Exit Do ]
    [ statements ]
Loop { While | Until } condition

部件

术语

定义

Do

必选。 开始 Do 循环的定义。

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 语句通常是更好的选择。

可以使用 While 或 Until 来指定 condition,但不能同时使用两个。

只能在循环的开头或结尾测试一次 condition。 如果在循环的开头(在 Do 语句中)测试 condition,则循环可能从不会运行一次。 如果在循环的结尾(在 Loop 语句中)进行测试,则循环总会至少运行一次。

条件通常通过两个值的比较得到,但也可以是任何计算为 Boolean 数据类型 (Visual Basic) 值(True 或 False)的表达式。 这包括已转换为 Boolean 的其他数据类型(如数字类型)的值。

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

提示

Do...Loop 结构在灵活性上比 While...End While 语句 (Visual Basic) 更强,这是因为,它可让您在 condition 停止为 True 或初次变为 True 时决定是否结束循环。 它还可让您在循环的开头或结尾测试 condition。

Exit Do

Exit Do 语句可以提供退出 Do…Loop 的备选方式。 Exit Do 将控制立即转移到 Loop 语句后面的语句。

Exit Do 通常在计算特定条件后使用,例如在 If...Then...Else 结构中。 如果检测到使继续迭代不必要或不可能的条件(如错误值或终止请求),则可能需要退出循环。 Exit Do 的一种用途是测试能够导致无限循环(即运行次数多甚至无限的循环)的条件。 可以使用 Exit Do 来退出循环。

可以在 Do…Loop 的任意位置包括任意数量的 Exit Do 语句。

当在嵌套的 Do 循环内使用时,Exit Do 会将控制权转移出最内层的循环,并交给下一层级别较高的嵌套。

示例

在下面的示例中,循环中的语句继续运行,直到 index 变量大于 10。 Until 子句在循环的末尾。

Dim index As Integer = 0
Do
    Debug.Write(index.ToString & " ")
    index += 1
Loop Until index > 10

Debug.WriteLine("")
' Output: 0 1 2 3 4 5 6 7 8 9 10 

下面的示例使用 While 子句,而不是 Until 子句,并在循环开始处(而非结束处)测试 condition。

Dim index As Integer = 0
Do While index <= 10
    Debug.Write(index.ToString & " ")
    index += 1
Loop

Debug.WriteLine("")
' Output: 0 1 2 3 4 5 6 7 8 9 10 

在下面的示例中,当 index 变量大于100 时,condition 将停止循环。 但是,循环中的 If 语句在索引变量大于 10 时将导致 Exit Do 语句停止循环。

Dim index As Integer = 0
Do While index <= 100
    If index > 10 Then
        Exit Do
    End If

    Debug.Write(index.ToString & " ")
    index += 1
Loop

Debug.WriteLine("")
' Output: 0 1 2 3 4 5 6 7 8 9 10 

下面的示例读取文本文件中的所有行。 OpenText 方法打开文件,并返回读取字符的 StreamReader。 在 Do...Loop 条件中,StreamReaderPeek 方法确定是否存在任何额外的字符。

Private Sub ShowText(ByVal textFilePath As String)
    If System.IO.File.Exists(textFilePath) = False Then
        Debug.WriteLine("File Not Found: " & textFilePath)
    Else
        Dim sr As System.IO.StreamReader = System.IO.File.OpenText(textFilePath)

        Do While sr.Peek() >= 0
            Debug.WriteLine(sr.ReadLine())
        Loop

        sr.Close()
    End If
End Sub

请参见

任务

如何:提高循环的性能 (Visual Basic)

参考

For...Next 语句 (Visual Basic)

Boolean 数据类型 (Visual Basic)

Exit 语句 (Visual Basic)

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

概念

循环结构 (Visual Basic)

嵌套的控件结构 (Visual Basic)

修订记录

Date

修订记录

原因

2011 年 1 月

重组了备注,并添加了示例。

信息补充。