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.");
}

.NET 小提琴現場演示

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 語句的末尾都需要’bre​​ak’關鍵字。這與允許落入系列中的下一個 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");
}

.NET 小提琴現場演示

請注意,與其他一些語言不同,無法在 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