break
在迴圈(for, foreach, do, while)中,break
語句中止最內層迴圈的執行並返回到它之後的程式碼。它也可以與 yield
一起使用,其中它指定迭代器已經結束。
for (var i = 0; i < 10; i++)
{
if (i == 5)
{
break;
}
Console.WriteLine("This will appear only 5 times, as the break will stop the loop.");
}
foreach (var stuff in stuffCollection)
{
if (stuff.SomeStringProp == null)
break;
// If stuff.SomeStringProp for any "stuff" is null, the loop is aborted.
Console.WriteLine(stuff.SomeStringProp);
}
break-statement 也用於 switch-case 結構中,以退出 case 或 default 段。
switch(a)
{
case 5:
Console.WriteLine("a was 5!");
break;
default:
Console.WriteLine("a was something else!");
break;
}
在 switch 語句中,每個 case 語句的末尾都需要’break’關鍵字。這與允許落入系列中的下一個 case 語句的某些語言相反。解決方法包括’goto’語句或按順序堆疊’case’語句。
以下程式碼將給出數字 0, 1, 2, ..., 9
,最後一行不會被執行。yield break
表示函式的結束(不僅僅是迴圈)。
public static IEnumerable<int> GetNumbers()
{
int i = 0;
while (true) {
if (i < 10) {
yield return i++;
} else {
yield break;
}
}
Console.WriteLine("This line will not be executed");
}
請注意,與其他一些語言不同,無法在 C#中標記特定的中斷。這意味著在巢狀迴圈的情況下,只會停止最裡面的迴圈:
foreach (var outerItem in outerList)
{
foreach (var innerItem in innerList)
{
if (innerItem.ShoudBreakForWhateverReason)
// This will only break out of the inner loop, the outer will continue:
break;
}
}
如果你想在此處突破外部迴圈,可以使用以下幾種策略之一,例如:
- 一個跳轉語句來跳出整個迴圈結構。
- 一個特定的標誌變數(以下示例中為
shouldBreak
),可以在外迴圈的每次迭代結束時檢查。 - 重構程式碼以在最內層迴圈體中使用
return
語句,或者完全避免整個巢狀迴圈結構。
bool shouldBreak = false;
while(comeCondition)
{
while(otherCondition)
{
if (conditionToBreak)
{
// Either tranfer control flow to the label below...
goto endAllLooping;
// OR use a flag, which can be checked in the outer loop:
shouldBreak = true;
}
}
if(shouldBreakNow)
{
break; // Break out of outer loop if flag was set to true
}
}
endAllLooping: // label from where control flow will continue