跳转到内容

Visual Basic/分支

来自维基教科书,开放的书籍,为开放的世界

分支是程序必须做出选择的点。使用这些数据结构,现在可以编写具有多种结果的程序。你可能熟悉第一种类型来自 代数,一个 If-Then 语句,或者 If P then Q。它们的工作方式几乎相同。另一种类型是 Select Case,这在某些情况下可能更容易。

这个概念的另一个名称是 条件子句。条件子句是在特定表达式(条件)为真时才执行的代码块。

If...Then 语句

[编辑 | 编辑源代码]

If...Then 语句是所有编程中最基本的语句之一。每种语言都有它们,或多或少。在 Visual Basic 中,If...Then 语句的语法如下

  If (condition) Then
      (reaction)
  End If
  • condition - 程序执行的一组测试。
  • reaction - 程序在条件返回真时遵循的指令。如果条件通过测试,则返回真,如果条件未通过测试,则返回假。

条件可以是任何东西,从

  If X = 1 Then
      MsgBox "X = 1"
  End If

  If InStr(1, sName, " ") > 0 Then
      sName = """" & sName & """"
  End If

如果条件只有一个反应,则该语句也可以在没有 End If 的情况下表示

If Y + 3 = 7 Then MsgBox "Y + 3 DOES = 7"

这些语句还有其他部分使它们更复杂。可以使用另外两个术语是 Else 和 ElseIf。

Else 将在条件为假的情况下,执行 Else 语句和 End If 语句之间的任何内容。

ElseIf 将在直接在其前面的条件为假的情况下,检查另一个条件并从那里开始。

If..Then..Else 语句

[编辑 | 编辑源代码]

If..Then..Else 语句是最简单的条件语句。它们也称为分支,因为当程序在执行过程中到达“If”语句时,控制将“分支”到两个或多个“方向”之一。If-Else 语句通常采用以下形式

  If condition Then
      statement
  Else
      other statement
  End If

如果满足原始条件,则执行第一个语句中的所有代码。可选的 Else 部分指定了在条件为假时将执行的备用语句。If-Else 语句可以扩展到以下形式

  If condition Then
      statement
  ElseIf condition Then
      other statement
  ElseIf condition Then
      other statement
      ...
  Else
      another statement
  End If

整个块中只执行一个语句。该语句将是第一个条件为真的语句。If-Else-If 结构的概念借助示例更容易理解

  Dim Temperature As Double
  ...
  If Temperature >= 40.0 Then
      Debug.Print "It's extremely hot"
  ElseIf 30.0 <= Temperature And Temperature<=39.0 Then
      Debug.Print "It's hot"
  ElseIf 20.0 <= Temperature And Temperature <= 29.0 Then
      Debug.Print "It's warm"
  ElseIf 10.0 <= Temperature And temperature <= 19.0 Then
      Debug.Print "It's cool"
  ElseIf 0.0 <= Temperature And Temperature <= 9.0 Then
      Debug.Print "It's cold"
  Else
      Debug.Print "It's freezing"
  End If

优化提示

[编辑 | 编辑源代码]

当此程序执行时,计算机将按顺序检查所有条件,直到其中一个条件与其对真的概念匹配。一旦发生这种情况,程序将执行紧随条件之后的语句并继续执行,而不会检查其他条件是否为真。因此,当你尝试优化程序时,最好按降序可能性对 If..Then..Else 条件进行排序。这将确保在最常见的情况下,计算机只需要执行更少的工作,因为它很可能只需要检查一两个 分支 才能找到它应该执行的语句。但是,在第一次编写程序时,尽量不要考虑太多,以免发现自己过早地进行优化。

在 Visual Basic Classic 中,具有多个条件的条件语句不使用短路求值。为了模拟 C/C++ 的短路求值,请使用上面的示例中所述的 ElseIf。事实上,对于复杂的表达式,显式的 If..Then..ElseIf 语句比等效的短路表达式更清晰易读。

Select Case

[编辑 | 编辑源代码]

通常需要将一个特定变量与多个常量表达式进行比较。对于这种条件表达式,使用 Select Case。上面的示例就是一个例子,也可以这样写

  Select Case Temperature
      Case Is >= 40#
          Debug.Print "It's extremely hot"
      Case 30# To 39#
          Debug.Print "It's hot"
      Case 20# To 29#
          Debug.Print "It's warm"
      Case 10# To 19#
          Debug.Print "It's cool"
      Case 0# To 9#
          Debug.Print "It's cold"
      Case Else
          Debug.Print "It's freezing"
  End Select

无条件语句

[编辑 | 编辑源代码]

无条件语句允许你在没有条件的情况下更改程序流程。在使用无条件语句时应谨慎。它们通常会使程序难以理解。阅读下面的 Goto 不邪恶吗? 以获取更多信息。

结束函数、子程序或属性,并返回到调用过程或函数。请注意,在 Visual Basic 中,从函数返回并分配返回值需要两个单独的语句。

对于过程

Exit Sub

对于函数

Exit function

对于属性

Exit Property

这个简单的命令结束程序的执行

例如

  Private Sub cmd1_Click()
      End
  End Sub

在这个例子中,当点击按钮 cmd1 时,程序将终止。End 命令是为了向后兼容而提供的,很少(如果有的话)需要用来结束 VB 程序。结束 VB 程序的正确方法是释放所有对象引用,停止任何运行的计时器,并退出任何正在执行的过程。在一个小的程序中,这可能意味着简单地卸载所有窗体。当没有活动的对象引用且没有代码运行时,VB 将以优雅的方式终止程序。使用 End 结束程序将以不优雅的方式终止程序(某些内容可能无法正常关闭)。

将控制转移到标签(或行号)之后的语句。

      Goto Label
      Dont_Do_Something
  Label:
      ...

在 Visual Basic 中,Goto 语句的目标必须在同一个过程中;这通过使其不可能跳入另一个子程序的中间来防止对该功能的滥用。

Goto 不邪恶吗?

[编辑 | 编辑源代码]

人们常说 Goto 是邪恶的,应该避免使用 goto。但往往被忽视的是,任何不是过程或函数中最后一个语句的退出语句也是无条件语句 - 伪装的 goto。

因此,如果你有包含多个退出语句的函数和过程,你也可以使用 goto。当涉及到可读性时,以下两个示例几乎相同

  Sub Use_Exit
      Do_Something
      If Test Then
          Exit Sub
      End If
      Do_Something_Else
  End Sub

  Sub Use_Goto is
      Do_Something
      If Test Then
          Goto Exit_Use_Goto
      End If
      Do_Something_Else
  Exit_Use_Goto:
  End Sub

在纯结构化方法中,既不需要 goto 也不需要多个退出语句

  Sub Use_If is
      Do_Something
      If Not Test Then
          Do_Something_Else
      End If
  End Sub

一些注意事项

  • Return 是一个保留字,只能与匹配的 Gosub 一起使用,并且 Gosub 必须驻留在同一个函数、子程序或属性中。它不能用于从函数、子程序或属性中返回 - 也许它应该读作 Exit Sub。
  • Visual Basic 中的错误处理不需要使用 Goto,但需要使用不同的语法。
  • 信不信由你,Visual Basic 支持行号,例如 Goto 20 是完全可以接受的,如果存在第 20 行!
  • 如上所示使用 Exit 代替 Goto 会产生一些副作用。调用 Exit Sub 会清除当前错误状态,即相当于 Err.Clear。

与 VB.Net 的兼容性

[编辑 | 编辑源代码]

如果您担心可能需要将代码移植到 VB.Net 而无需在以后重新转换,则可能应该完全避免使用 *goto*。

一种替代方法是伪循环。它的目的是伪造一个出现在例程中后面的 *goto* 目标。

  Sub Use_PseudoLoop
    
      Do 'Start the pseudo loop.  Exists only so that you can use Exit Do
          Try_Something
          If Test Then 
              Exit Do
          End If
          Try_Again
          If Test Then 
              Exit Do
          End If
          Try_Try_Again
      Loop While False ' will never loop
      Do_One_Last_Thing
  
  End Sub

当然,这个例子可以使用 *If..Then..Else..End If* 重新转换,而根本不需要任何 Exit 语句,所以它有点人为。

  Sub Use_IfThen
  
      Try_Something
      If Not Test Then 
          Try_Again
          If Not Test Then 
              Try_Try_Again
          End If
      End If
      Do_One_Last_Thing
  
  End Sub


前一个:简单算术 目录 下一个:循环
华夏公益教科书