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
| 前一個:簡單算術 | 目錄 | 下一個:迴圈 |