C#打破

示例

在循环中(forforeach,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 Fiddle上的实时演示

foreach (var stuff in stuffCollection)
{
    if (stuff.SomeStringProp == null)
        break;
    // Ifstuff.SomeStringPropfor any "stuff" is null, the loop is aborted.
    Console.WriteLine(stuff.SomeStringProp);
}

break-statement也用于切换案例构造中,以突破案例或默认段。

switch(a)
{
    case 5:
        Console.WriteLine("一个是5!");
        break;

    default:
        Console.WriteLine("一个别的东西!");
        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");
}

.NET Fiddle上的实时演示

请注意,与某些其他语言不同,无法在C#中标记特定的中断。这意味着在嵌套循环的情况下,仅最里面的循环将被停止:

foreach (var outerItem in outerList)
{
    foreach (var innerItem in innerList)
    {
        if (innerItem.ShoudBreakForWhateverReason)
            // 这只会打破内部循环,外部会继续:
            break; 
    }
}

如果要在此处突破循环,可以使用几种不同的策略之一,例如:

  • 一个跳转语句跳到整个循环结构的出来。

  • shouldBreak可以在外部循环的每次迭代结束时检查的特定标志变量(在以下示例中)。

  • 重构代码以return在最内部的循环主体中使用一条语句,或者完全避免整个嵌套循环结构。

bool shouldBreak = false;
while(comeCondition)
{
    while(otherCondition)
    {
        if (conditionToBreak)
        {
            // 转移控制流程都流向以下标签...
            goto endAllLooping;

            // 或使用一个标志,可以在外部循环中对其进行检查:
            shouldBreak = true;
        }
    }

    if(shouldBreakNow)
    {
        break; // 如果标志设置为true,则跳出外循环
    }
}

endAllLooping: // 控制流将继续的标签