短路
通过使用 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
。