Visual Basic 流程控制
最后修改于 2023 年 10 月 18 日
在本 Visual Basic 教程中,我们将讨论流程控制。我们将定义几个关键字,这些关键字使我们能够控制 Visual Basic 程序的流程。
在 Visual Basic 语言中,有几个关键字用于更改程序的流程。当程序运行时,语句从源文件的顶部到底部依次执行。这个流程可以通过特定的关键字来改变。语句可以多次执行。有些语句被称为条件语句。它们仅在满足特定条件时执行。
If 语句
If
语句具有以下一般形式
If (expression) statement End If
If
关键字用于检查表达式是否为真。如果为真,则执行一条语句。该语句可以是一个单独的语句或一个复合语句。一个复合语句由 If/End If 块中包含的多个语句组成。括号是可选的。
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
条件满足,消息被写入控制台。
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
关键字后面的语句。
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
关键字。
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
语句。如果找不到其他匹配项,则执行该语句。
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
关键字可以验证一系列数值案例。
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
关键字括起来的块内的语句。每次表达式计算结果为真时,都会执行这些语句。
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
关键字。
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
语句。在这种结构中,我们声明一个计数器变量,该变量的值在循环的每次重复期间自动增加或减少。
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
关键字。它控制计数器变量将如何增加或减少。
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
语句逐个遍历数组或集合,并将当前值复制到结构中定义的变量。
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
, For
或 Select
语句定义的块。
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
, For
和 While
语句结合使用。
在以下示例中,我们打印一个无法被 2 整除而没有余数的数字列表。
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 教程中,我们讨论了控制流结构。