Visual Basic/分支
分支是程序必须做出选择的点。使用这些数据结构,现在可以编写具有多种结果的程序。你可能熟悉第一种类型来自 代数,一个 If-Then 语句,或者 If P then Q。它们的工作方式几乎相同。另一种类型是 Select Case,这在某些情况下可能更容易。
这个概念的另一个名称是 条件子句。条件子句是在特定表达式(条件)为真时才执行的代码块。
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”语句时,控制将“分支”到两个或多个“方向”之一。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 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。当涉及到可读性时,以下两个示例几乎相同
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 而无需在以后重新转换,则可能应该完全避免使用 *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
前一个:简单算术 | 目录 | 下一个:循环 |