# 控制流

> 原文： [https://zetcode.com/lang/visualbasic/flowcontrol/](https://zetcode.com/lang/visualbasic/flowcontrol/)

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

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

## `If`语句

`If`语句具有以下一般形式：

```vb
If (expression)
    statement
End If

```

`If`关键字用于检查表达式是否为真。 如果为`true`，则执行一条语句。 该语句可以是单个语句或复合语句。 复合语句由`If/End If`块包围的多个语句组成。

```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`为`true`，因此将执行块内的语句。

```vb
$ ./ifstatement.exe 
num variable is positive

```

满足条件，并将消息写入控制台。

```vb
Option Strict On

Module Example

    Dim num As Byte = 31

    Sub Main()

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

    End Sub

End Module

```

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

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

```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

```

我们有性别变量。 它具有`"female"`字符串。 布尔表达式的计算结果为`false`，我们在控制台中得到`"It is a girl"`。

```vb
$ ./branch.exe 
It is a girl

```

我们可以使用`Else If`关键字创建多个分支。 仅当不满足先前条件时，`Else If`关键字才会测试其他条件。 请注意，我们可以在测试中使用多个`Else If`关键字。

```vb
Option Strict On

Module Example

    Dim a As Byte = 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

```

我们有一个数值变量，并测试它是否为负数或正数或等于零。 第一个表达式的计算结果为`false`。 满足第二个条件。 程序在控制台上输出`a equals to zero`。 分支的其余部分将被跳过。

## `Select`语句

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

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

```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

```

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

```vb
$ ./selectcase.exe 
hu
Hungary

```

我们在控制台输入了`"hu"`字符串，程序以`"Hungary"`作为响应。

使用`Select`关键字可以验证一系列数字个案。

```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

```

前面的程序使用数值范围来标识一个人的年龄组。

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

```

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

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

```

在这里，我们指定一个值范围。 如果用户输入的值在 0 到 21 之间（包括 0 和 21），则程序将在控制台上打印`"Junior"`。

```vb
$ ./agerange.exe 
43
Adult

```

我们输入了 43，程序以`Adult`字符串作为响应。

## `While`语句

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

这是`While`循环的一般形式：

```vb
While (expression):
    statement
End While

```

`While`关键字在`While`和`End While`关键字包围的块内执行语句。 每次将表达式求值为`true`时都会执行这些语句。

```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`循环包含三个部分：初始化，测试和更新。 语句的每次执行都称为循环。

```vb
Dim i As Integer = 0

```

我们启动`i`变量。 它用作计数器。

```vb
While i < 10
...
End While

```

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

```vb
i = i + 1

```

`While`循环的最后一个第三阶段。 正在更新。 我们增加计数器。 请注意，对`While`循环的不正确处理可能会导致循环不断。

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

```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`语句。 在此构造中，我们声明一个计数器变量，该变量在每次循环重复期间都会自动增加或减少值。

```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`打印到控制台。

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

```

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

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

```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。

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

```

该步骤也可以是负数。 我们将计数器初始化为 9。每次迭代，计数器都将减小步长值。

## `For Each`语句

`For Each`构造简化了遍历数据集合的过程。 它没有明确的计数器。 `For Each`语句一个接一个地遍历数组或集合，并将当前值复制到构造中定义的变量中。

```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`语句遍历一系列行星。

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

```

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

```vb
$ ./planets.exe 
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune

```

运行上面的 Visual Basic 程序将给出此输出。

## `Exit`，`Continue`语句

`Exit`语句可用于终止由`While`，`For`或`Select`语句定义的块。

```vb
Option Strict On

Module Example

    Dim val As Integer

    Sub Main

        While (True)

            val = CType((30 * Rnd), Integer) + 1
            Console.Write(val.ToString & " ")
            If (val = 22)
                Exit While
            End If        

        End While

        Console.Write(vbNewLine)

    End Sub

End Module

```

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

```vb
$ ./exitstm.exe 
30 12 13 20 19 4 2 9 6 9 22 

```

我们可能会得到这样的东西。

`Continue`语句用于跳过循环的一部分，并继续循环的下一个迭代。 它可以与`Do`，`For`和`While`语句结合使用。

在下面的示例中，我们将打印一个数字列表，这些数字不能除以 2 而没有余数。

```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.ToString() + " ") 

        End While

        Console.Write(vbNewLine)

    End Sub

End Module

```

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

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

```

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

在 Visual Basic 教程的这一部分中，我们讨论的是控制流结构。