C# Language rompere


Esempio

In un ciclo (for, foreach, do, while) l'istruzione break interrompe l'esecuzione del ciclo più interno e ritorna al codice dopo di esso. Inoltre può essere utilizzato con yield in cui specifica che un iteratore è giunto al termine.

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

Live Demo su .NET Fiddle

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

L'istruzione break viene anche utilizzata nei costrutti del caso di commutazione per uscire da un caso o da un segmento predefinito.

switch(a)
{
    case 5:
        Console.WriteLine("a was 5!");
        break;

    default:
        Console.WriteLine("a was something else!");
        break;
}

Nelle istruzioni switch, la parola chiave 'break' è richiesta alla fine di ogni dichiarazione di caso. Ciò è contrario ad alcune lingue che consentono di "passare attraverso" alla successiva dichiarazione del caso nella serie. I rimedi per questo includevano le istruzioni "goto" o l'impilamento sequenziale delle dichiarazioni "case".

Il codice seguente darà i numeri 0, 1, 2, ..., 9 e l'ultima riga non verrà eseguita. yield break indica la fine della funzione (non solo un loop).

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

Live Demo su .NET Fiddle

Nota che a differenza di altri linguaggi, non c'è modo di etichettare una particolare interruzione in C #. Ciò significa che nel caso di cicli annidati, verrà interrotto solo il ciclo più interno:

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; 
    }
}

Se vuoi uscire dal ciclo esterno qui, puoi utilizzare una delle diverse strategie, ad esempio:

  • Una dichiarazione goto per saltare fuori dall'intera struttura del ciclo.
  • Una specifica variabile di flag ( shouldBreak nell'esempio seguente) che può essere verificata alla fine di ogni iterazione del ciclo esterno.
  • Rifattorizzare il codice per utilizzare un'istruzione return nel corpo del ciclo più interno o evitare del tutto l'intera struttura del ciclo annidato.
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