ZetCode

Visual Basic 流程控制

最后修改于 2023 年 10 月 18 日

在本 Visual Basic 教程中,我们将讨论流程控制。我们将定义几个关键字,这些关键字使我们能够控制 Visual Basic 程序的流程。

在 Visual Basic 语言中,有几个关键字用于更改程序的流程。当程序运行时,语句从源文件的顶部到底部依次执行。这个流程可以通过特定的关键字来改变。语句可以多次执行。有些语句被称为条件语句。它们仅在满足特定条件时执行。

If 语句

If 语句具有以下一般形式

If (expression)
    statement
End If

If 关键字用于检查表达式是否为真。如果为真,则执行一条语句。该语句可以是一个单独的语句或一个复合语句。一个复合语句由 If/End If 块中包含的多个语句组成。括号是可选的。

Program.vb
Option Strict On

Module Example

    Dim num As Byte = 31

    Sub Main()

        If num > 0
            Console.WriteLine("num variable is positive")
        End If

    End Sub

End Module

我们有一个 num 变量。它被赋值为 31。If 关键字检查一个布尔表达式。表达式放在方括号中。31 > 0 为真,因此块内的语句被执行。

$ dotnet run
num variable is positive

条件满足,消息被写入控制台。

Program.vb
Option Strict On

Module Example

    Dim num As Short = 31

    Sub Main()

        If num > 0 Then
            Console.WriteLine("num variable is positive")
            Console.WriteLine($"num variable equals {num}")
        End If

    End Sub

End Module

更多语句可以在由 If, End If 关键字创建的块内执行。

If num > 0 Then

可选地,If 关键字可以用 Then 终止。

我们可以使用 Else 关键字来创建一个简单的分支。如果 If 关键字后面的方括号内的表达式计算结果为假,则自动执行 Else 关键字后面的语句。

Program.vb
Option Strict On

Module Example

    Dim sex As String

    Sub Main()

        sex = "female"

        If sex = "male"
          Console.WriteLine("It is a boy")
        Else
          Console.WriteLine("It is a girl")
        End If

    End Sub

End Module

我们有一个 sex 变量。它有 "female" 字符串。布尔表达式的计算结果为假,我们在控制台中得到 "It is a girl"。

$ dotnet run
It is a girl

我们可以使用 Else If 关键字创建多个分支。只有当先前的条件未满足时,Else If 关键字才会测试另一个条件。请注意,我们可以在测试中使用多个 Else If 关键字。

Program.vb
Option Strict On

Module Example

    Dim a As Integer = 0

    Sub Main()

        If a < 0
          Console.WriteLine("a is negative")
        Else If a = 0
          Console.WriteLine("a equals to zero")
        Else
          Console.WriteLine("a is a positive number")
        End If

    End Sub

End Module

我们有一个数值变量,我们测试它是否为负数、正数或是否等于零。第一个表达式的计算结果为假。满足第二个条件。程序在控制台中打印 'a equals to zero'。其余的分支被跳过。

Select 语句

Select 语句是一个选择控制流语句。它允许使用变量或表达式的值通过多路分支来控制程序执行的流程。它以比使用 If, Else If 语句的组合更简单的方式创建多个分支。

我们有一个变量或一个表达式。Select 关键字用于根据值列表测试变量或表达式的值。值列表用 Case 关键字表示。如果值匹配,则执行 Case 之后的语句。有一个可选的 Case Else 语句。如果找不到其他匹配项,则执行该语句。

Program.vb
Option Strict On

Module Example

    Dim domain As String

    Sub Main()

        domain = Console.ReadLine()

        Select domain
            Case "us"
                Console.WriteLine("United States")
            Case "de"
                Console.WriteLine("Germany")
            Case "sk"
                Console.WriteLine("Slovakia")
            Case "hu"
                Console.WriteLine("Hungary")
            Case Else
                Console.WriteLine("Unknown")
        End Select

    End Sub

End Module

在我们的程序中,我们有一个 domain 变量。我们从命令行读取变量的值。我们使用 Case 语句来测试变量的值。有几个选项。例如,如果值等于 "us",则将 "United States" 字符串打印到控制台。

$ dotnet run
hu
Hungary

我们已经在控制台中输入了 "hu" 字符串,程序响应为 "Hungary"。

Select 关键字可以验证一系列数值案例。

Program.vb
Option Strict On

Module Example

    Dim age As Byte

    Sub Main()

        Try
            age = Console.ReadLine()
        Catch
            Console.WriteLine("Invalid value")
            End
        End Try

        Select age
            Case 0 To 21
                Console.WriteLine("Junior")
            Case 22 To 60
                Console.WriteLine("Adult")
            Case Else
                Console.WriteLine("Senior")
        End Select

    End Sub

End Module

前面的程序使用一系列数值来识别一个人的年龄组。

Try
    age = Console.ReadLine()
Catch
    Console.WriteLine("Invalid value")
    End
End Try

从控制台读取一个值。我们只能使用数值数据。Try, Catch, End Try 关键字用于异常处理。如果抛出异常,则执行 Catch 关键字后面的语句。End 语句终止程序。

Case 0 To 21
    Console.WriteLine("Junior")

这里我们指定了一系列值。如果用户输入的值在 0 到 21 之间(包括 0 和 21),则程序将 "Junior" 打印到控制台。

$ dotnet run
43
Adult

While 语句

While 语句是一个控制流语句,它允许根据给定的布尔条件重复执行代码。

While (expression)
    statement
End While

While 关键字执行由 While, End While 关键字括起来的块内的语句。每次表达式计算结果为真时,都会执行这些语句。

Program.vb
Option Strict On

Module Example

    Sub Main()

        Dim i As Integer = 0
        Dim sum As Integer = 0

        While i < 10

            i = i + 1
            sum += i

        End While

        Console.WriteLine(sum)

    End Sub

End Module

在代码示例中,计算一系列数字的值的总和。

While 循环有三个部分:初始化、测试和更新。语句的每次执行称为一个周期。

Dim i As Integer = 0

我们初始化 i 变量。它用作计数器。

While i < 10
...
End While

While 关键字后面的表达式是第二阶段,即测试。主体中的语句被执行,直到表达式的计算结果为假。

i = i + 1

While 循环的最后一个,第三个阶段。更新。我们增加计数器。请注意,不正确地处理 While 循环可能导致无限循环。

即使条件不满足,也可以至少运行一次语句。为此,我们可以使用 Do, Loop While 关键字。

Program.vb
Option Strict On

Module Example

    Sub Main()

        Dim count As Integer = 0

        Do
            Console.WriteLine(count)
        Loop While (count <> 0)

    End Sub

End Module

首先执行迭代,然后计算真表达式。

For Next 语句

当循环开始之前就知道循环次数时,我们可以使用 For Next 语句。在这种结构中,我们声明一个计数器变量,该变量的值在循环的每次重复期间自动增加或减少。

Program.vb
Option Strict On

Module Example

    Sub Main()

        For i As Integer = 0 To 9
            Console.WriteLine(i)
        Next

    End Sub

End Module

在此示例中,我们将数字 0..9 打印到控制台。

For i As Integer = 0 To 9
    Console.WriteLine(i)
Next

我们将计数器 i 初始化为零。Next 语句将计数器增加一,直到计数器等于 9。

Visual Basic 有一个可选的 Step 关键字。它控制计数器变量将如何增加或减少。

Program.vb
Option Strict On

Module Example

    Sub Main()

        For i As Integer = 9 To 0 Step -1
            Console.WriteLine(i)
        Next

    End Sub

End Module

在上面的示例中,我们以相反的顺序打印数字 0..9。

For i As Integer = 9 To 0 Step -1
    Console.WriteLine(i)
Next

步长也可以是一个负数。我们将计数器初始化为 9。每次迭代,计数器都会减少步长值。

For Each 语句

For Each 结构简化了对数据集合的遍历。它没有显式计数器。For Each 语句逐个遍历数组或集合,并将当前值复制到结构中定义的变量。

Program.vb
Option Strict On

Module Example

    Sub Main()

        Dim planets() As String = { "Mercury", "Venus",
            "Earth", "Mars", "Jupiter", "Saturn",
            "Uranus", "Neptune" }

        For Each planet As String In planets
            Console.WriteLine(planet)
        Next

    End Sub

End Module

在这个例子中,我们使用 For Each 语句遍历一个行星数组。

For Each planet As String In planets
    Console.WriteLine(planet)
Next

For Each 语句的用法很简单。planets 是我们遍历的数组。planet 是一个临时变量,它具有数组中的当前值。For Each 语句遍历所有行星,并将它们打印到控制台。

$ dotnet run
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune

Exit, Continue 语句

Exit 语句可用于终止由 While, ForSelect 语句定义的块。

Program.vb
Option Strict On

Module Example

    Dim val As Integer

    Sub Main

        Randomize

        While True

            val = CType((30 * Rnd), Integer) + 1
            Console.Write(val.ToString & " ")

            If val = 22 Then
                Exit While
            End If

        End While

        Console.Write(vbCrLf)

    End Sub

End Module

我们定义一个无限的 While 循环。只有一种方法可以跳出这样的循环。我们必须使用 Exit While 语句。我们从 1 到 30 中选择一个随机值。我们打印该值。如果该值等于 22,我们结束无限 while 循环。

$ dotnet run
30 12 13 20 19 4 2 9 6 9 22

Continue 语句用于跳过循环的一部分并继续循环的下一次迭代。它可以与 Do, ForWhile 语句结合使用。

在以下示例中,我们打印一个无法被 2 整除而没有余数的数字列表。

Program.vb
Option Strict On

Module Example

    Dim num As Integer = 0

    Sub Main()

        While num < 1000

            num = num + 1

            If (num Mod 2) = 0
                Continue While
            End If

            Console.Write($"{num} ")

        End While

        Console.Write(vbCrLf)

    End Sub

End Module

我们使用 While 循环遍历数字 1..999。

If (num Mod 2) = 0
    Continue While
End If

如果表达式 num Mod 2 返回 0,则所讨论的数字可以被 2 整除。将执行 Continue 语句,并且循环的其余部分被跳过。在我们的例子中,循环的最后一条语句被跳过,并且数字没有打印到控制台。开始下一次迭代。

在本 Visual Basic 教程中,我们讨论了控制流结构。