短路
通過使用 Exit
或 Continue
語句,可以在任何時間點終止或繼續任何迴圈。
退出
你可以通過提前退出來停止任何迴圈。為此,你可以使用關鍵字 Exit
以及迴圈名稱。
環 | 退出宣告 |
---|---|
對於 | Exit For |
每個人 | Exit For |
做的 | Exit Do |
而 | Exit While |
儘早退出迴圈是一種提高效能的好方法,只需迴圈必要的次數即可滿足應用程式的需求。下面是一旦找到數字 2
,迴圈將退出的示例。
Dim Numbers As Integer() = {1,2,3,4,5}
Dim SoughtValue As Integer = 2
Dim SoughtIndex
For Each i In Numbers
If i = 2 Then
SoughtIndex = i
Exit For
End If
Next
Debug.Print(SoughtIndex)
繼續
除了早期退出,你還可以決定是否需要繼續下一個迴圈迭代。使用 Continue
語句可以輕鬆完成此操作。就像 Exit
一樣,它由迴圈名稱繼續。
環 | 繼續宣告 |
---|---|
對於 | Continue For |
每個人 | Continue For |
做的 | Continue Do |
而 | Continue While |
這是一個阻止偶數加到總和中的例子。
Dim Numbers As Integer() = {1,2,3,4,5}
Dim SumOdd As Integer = 0
For Each i In Numbers
If Numbers(i) \ 2 = 0 Then Continue For
SumOdd += Numbers(i)
Next
使用建議
有兩種替代技術可以代替使用 Exit
或 Continue
。
你可以宣告一個新的布林變數,將其初始化為一個值並有條件地將其設定為迴圈內的另一個值; 然後,你可以使用基於該變數的條件語句(例如 If
)來避免在後續迭代中執行迴圈內的語句。
Dim Found As Boolean = False
Dim FoundIndex As Integer
For i As Integer = 0 To N - 1
If Not Found AndAlso A(i) = SoughtValue Then
FoundIndex = i
Found = True
End If
Next
對這種技術的一個反對意見是它可能效率低下。例如,如果在上面的例子中 N
是 1000000 並且陣列 A
的第一個元素等於 SoughtValue
,則迴圈將再迭代 999999 次而不做任何有用的事情。然而,在某些情況下,該技術可以具有更高清晰度的優點。
你可以使用 GoTo
語句跳出迴圈。請注意,你不能使用 GoTo
跳轉到迴圈中。
Dim FoundIndex As Integer
For i As Integer = 0 To N - 1
If A(i) = SoughtValue Then
FoundIndex = i
GoTo Found
End If
Next
Debug.Print("Not found")
Found:
Debug.Print(FoundIndex)
這種技術有時可能是跳出迴圈並避免在迴圈自然結束後執行的一個或多個語句的最佳方法。
你應該考慮所有替代方案,並使用最符合你要求的方案,考慮效率,編寫程式碼的速度和可讀性(因此可維護性)。
當它是最好的選擇時,不要在使用 GoTo
的情況下推遲使用 GoTo
。