Do...Loop 语句 (Visual Basic)

Boolean 条件为 True 或在条件变为 True 之前,重复语句块。

语法

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

组成部分

术语 定义
Do 必需。 开始 Do 循环的定义。
While 如果使用 Until,则无法提供。 重复循环,直到 conditionFalse
Until 如果使用 While,则无法提供。 重复循环,直到 conditionTrue
condition 可选。 Boolean 表达式。 如果 conditionNothing,则 Visual Basic 将其视为 False
statements 可选。 一个或多个重复的语句,或在 conditionTrue 之前重复。
Continue Do 可选。 将控制转移到 Do 循环的下一次迭代。
Exit Do 可选。 将控制转移到 Do 循环外。
Loop 必需。 终止 Do 循环的定义。

注解

如果希望在满足条件之前重复一组语句,请使用 Do...Loop 结构。 如果要将语句重复一组次数,则 For...Next Statement 通常是更好的选择。

您可以使用 WhileUntil 来指定 condition,但不能同时使用两者。 如果两者均未提供,则循环将继续进行,直到 Exit 传输控制退出循环。

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

这种情况通常是由两个值比较导致的,但它可以是计算结果为布尔数据类型 值 (TrueFalse) 的任何表达式。 这包括已转换为 Boolean 的其他数据类型(如数值类型)的值。

可以通过将 1 个循环放入另一个循环来嵌套 Do 循环。 还可以在彼此之间嵌套不同种类的控制结构。 有关详细信息,请参阅嵌套控件结构

注意

Do...Loop 结构比 While...End While 语句更灵活,因为它可用于决定在 condition 停止 True 或者在第一次变为 True 时结束循环。 它还能够在循环的开头或结尾测试 condition

退出 Do

Exit Do 语句可以提供退出 Do…Loop 的替代方法。 Exit Do 立即将控件传递给 Loop 语句后面的语句。

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

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

在嵌套 Do 循环内使用时,Exit Do 将控制转移出最内层循环, 并将其转移到下一个更高级别的嵌套。

示例 1

在下面的示例中,循环中的语句将继续运行,直到 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 

示例 2

下面的示例使用 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 

示例 3

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

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 

示例 4

下面的示例读取文本文件中的所有行。 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

另请参阅