C # loop - break vs. continue


797

In un ciclo C # (sentiti libero di rispondere per altre lingue), qual è la differenza tra interrompere e continuare come mezzo per lasciare la struttura del ciclo e passare alla successiva iterazione?

Esempio:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what's the difference between this and continue ?
        //continue;
    }
}

2
post sul blog con il culmine di sotto adamthings.com/post/2012/07/26/…
Adam

8
continue;interromperà l'elaborazione della corrente rowe continuerà con la successiva row dalla raccolta. D'altra parte, break;lascerà foreachcompletamente l' istruzione e le righe rimanenti non verranno mai elaborate.
Jeppe Stig Nielsen,

Risposte:


1500

breakuscirà il ciclo completamente, continuesarà solo salta l'iterazione corrente.

Per esempio:

for (int i = 0; i < 10; i++) {
    if (i == 0) {
        break;
    }

    DoSomeThingWith(i);
}

L'interruzione causerà l'uscita del loop alla prima iterazione - DoSomeThingWithnon verrà mai eseguita. Questo qui:

for (int i = 0; i < 10; i++) {
    if(i == 0) {
        continue;
    }

    DoSomeThingWith(i);
}

Non eseguirà DoSomeThingWithper i = 0, ma il loop continuerà e DoSomeThingWithsarà giustiziato per i = 1a i = 9.


2
Perché le loro parentesi graffe continuano - so che funziona senza di loro, ma perché?
George Willcox,

52
@GeorgeWillcox Il mio io più giovane e più sciocco non aveva ancora imparato il valore dell'uso delle parentesi graffe, sempre. (Sono opzionali in C # per le singole istruzioni, ma non inserirle rende più semplice l'introduzione di un bug in seguito. Vedi anche programmers.stackexchange.com/a/16530/6342 )
Michael Stum

386

Un modo davvero semplice per capirlo è posizionare la parola "loop" dopo ciascuna delle parole chiave. I termini ora hanno senso se sono appena letti come frasi di tutti i giorni.

break loop - il looping è interrotto e si arresta.

continue loop - loop continua a essere eseguito con la successiva iterazione.


105

break fa saltare il contatore del programma dall'ambito del loop più interno

for(i = 0; i < 10; i++)
{
    if(i == 2)
        break;
}

Funziona così

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto BREAK;
}
BREAK:;

continua salta alla fine del loop. In un ciclo for, continua salta all'espressione dell'incremento.

for(i = 0; i < 10; i++)
{
    if(i == 2)
        continue;

    printf("%d", i);
}

Funziona così

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto CONTINUE;

    printf("%d", i);

    CONTINUE:;
}

2
Ho notato che molti loop qui usano solo il forloop standard , ma funzionerà con loop pre e post testati while? La gotonotazione mi porta a crederci, ma ho bisogno di una verifica.
Daniel Park,

1
@Daniel, per i cicli WHILE puoi usare BREAK e CONTINUE, nessun problema.
Amila,

@DanielPark Per entrambi while("pre-testato") e do- while("post-test"), dopo continue;che è stata soddisfatta un'istruzione, la prossima cosa che accadrà è che la condizione del ciclo viene valutata per decidere se deve essere eseguita un'iterazione aggiuntiva. Naturalmente, con break;la condizione del loop non selezionata, il loop viene semplicemente chiuso completamente. Quindi l' gotoanalogia è buona anche per comprendere questo aspetto.
Jeppe Stig Nielsen,

37

Mi confondevo sempre se avrei dovuto usare break o continuare. Questo è ciò che mi aiuta a ricordare:

Quando utilizzare break vs continue?

  1. Rompere - è come rompere. È triste, vi state separando. Il ciclo è uscito.

Rompere

  1. Continua - significa che oggi ti riposerai e risolverai tutto domani (cioè salterai l'attuale iterazione)!

Continua


Condividerò questo con il mio partner. Può essere Continua dovrebbe essere rinominato in GetOverIt e Break dovrebbe essere rinominato in MoveOnForward. Non c'è da stupirsi che siamo chiamati geek, come ha senso Break avere senso? Sembra distruttivo. E uno che deve essere aggiunto è - STOP, o anche meglio EndIt - risolverà molti bug e renderà il C-sharp davvero nitido.
Mike

Di nuovo nell'alluvione Lo stesso vecchio viaggio era allora Allora ho fatto un grosso errore Provate a vederlo una volta a modo mio
Talal Zahid

@TalalZahid non capisco?
BKSpurgeon,

28

breakfermerebbe foreachcompletamente il loop, continuesalterebbe al successivo DataRow.


20

Ci sono più di alcune persone a cui non piace breake continue. L'ultima lamentela che ho visto su di loro è stata in JavaScript: The Good Parts di Douglas Crockford. Ma trovo che a volte usarne uno semplifichi davvero le cose, specialmente se la tua lingua non include uno do-whileo uno do-untilstile di loop.

Tendo a usarlo breaknei loop che stanno cercando un elenco di qualcosa. Una volta trovato, non ha senso continuare, quindi potresti anche smettere.

Uso continuequando faccio qualcosa con la maggior parte degli elementi di un elenco, ma voglio ancora saltarne alcuni.

La breakdichiarazione è utile anche quando si fa il polling per una risposta valida da parte di qualcuno o qualcosa. Invece di:

Ask a question
While the answer is invalid:
    Ask the question

È possibile eliminare alcuni duplicati e utilizzare:

While True:
    Ask a question
    If the answer is valid:
        break

Il do-untilciclo che ho menzionato prima è la soluzione più elegante per quel particolare problema:

Do:
    Ask a question
    Until the answer is valid

Nessuna duplicazione e nemmeno breaknecessaria.


13

Tutti hanno dato un'ottima spiegazione. Sto ancora pubblicando la mia risposta solo per fare un esempio se ciò può aiutare.

// break statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        break; // It will force to come out from the loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}

Ecco l'output:

0 [Stampato] 1 [Stampato] 2 [Stampato]

Pertanto, 3 [Stampato] e 4 [Stampato] non verranno visualizzati poiché si verifica un'interruzione quando i == 3

//continue statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        continue; // It will take the control to start point of loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}

Ecco l'output:

0 [Stampato] 1 [Stampato] 2 [Stampato] 4 [Stampato]

Quindi 3 [Stampato] non verrà visualizzato poiché continua quando i == 3


7

Rompere

Break forza un loop ad uscire immediatamente.

Continua

Questo fa l'opposto della rottura. Invece di terminare il ciclo, esegue immediatamente un nuovo ciclo, saltando il resto del codice.


1
Continua controlla anche le condizioni del loop :)
Grantly

1
Continuenon è l'opposto di break, breakarresta il ciclo, continueinterrompe l'iterazione corrente.
Steven

6

Risposta semplice:

Break esce immediatamente dal loop.
Continua avvia l'elaborazione dell'elemento successivo. (Se ce ne sono, saltando alla linea di valutazione del per / while)


6

Per esempio

foreach(var i in Enumerable.Range(1,3))
{
    Console.WriteLine(i);
}

Stampa 1, 2, 3 (su righe separate).

Aggiungi una condizione di interruzione su i = 2

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        break;

    Console.WriteLine(i);
}

Ora il ciclo stampa 1 e si interrompe.

Sostituisci l'interruzione con una continuazione.

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        continue;

    Console.WriteLine(i);
}

Ora per stampare in loop 1 e 3 (saltando 2).

Pertanto, breakinterrompe il ciclo, mentre continuesalta alla successiva iterazione.


5

Ruby purtroppo è un po 'diverso. PS: La mia memoria è un po 'confusa su questo, quindi mi scuso se sbaglio

invece di break / continue, ha break / next, che si comportano allo stesso modo in termini di loop

I loop (come tutto il resto) sono espressioni e "restituiscono" l'ultima cosa che hanno fatto. Il più delle volte, ottenere il valore restituito da un ciclo è inutile, quindi tutti lo fanno

a = 5
while a < 10
    a + 1
end

Puoi comunque farlo

a = 5
b = while a < 10
    a + 1
end # b is now 10

TUTTAVIA, un sacco di codice ruby ​​'emula' un ciclo usando un blocco. L'esempio canonico è

10.times do |x|
    puts x
end

Poiché è molto più comune per le persone voler fare le cose con il risultato di un blocco, è qui che diventa disordinato. break / next significa cose diverse nel contesto di un blocco.

break salterà fuori dal codice che ha chiamato il blocco

next salterà il resto del codice nel blocco e 'restituirà' ciò che si specifica al chiamante del blocco. Questo non ha alcun senso senza esempi.

def timesten
    10.times{ |t| puts yield t }
end


timesten do |x|
   x * 2
end
# will print
2
4
6
8 ... and so on


timesten do |x|
    break
    x * 2
end
# won't print anything. The break jumps out of the timesten function entirely, and the call to `puts` inside it gets skipped

timesten do |x|
    break 5
    x * 2
end
# This is the same as above. it's "returning" 5, but nobody is catching it. If you did a = timesten... then a would get assigned to 5

timesten do |x|
    next 5
    x * 2
end 
# this would print
5
5
5 ... and so on, because 'next 5' skips the 'x * 2' and 'returns' 5.

Quindi si Ruby è fantastico, ma ha alcuni terribili astucci d'angolo. Questa è la seconda peggiore che abbia mai visto nei miei anni di utilizzo :-)


5

Per favore, lasciami affermare l'ovvio: nota che l'aggiunta di né break né continue, riprenderà il programma; cioè ho intrappolato per un certo errore, quindi dopo averlo registrato, volevo riprendere l'elaborazione, e c'erano più attività di codice tra la riga successiva, quindi l'ho lasciato cadere.


3

Per uscire completamente da un ciclo foreach, viene utilizzato break ;

Per passare alla successiva iterazione nel ciclo, viene utilizzato continue ;

Break è utile se stai eseguendo il ciclo continuo di una raccolta di oggetti (come Righe in un Datatable) e stai cercando una corrispondenza particolare, quando trovi quella corrispondenza, non è necessario continuare attraverso le righe rimanenti, quindi desideri interrompere su.

Continua è utile quando hai realizzato ciò di cui hai bisogno per completare un'iterazione ciclica. Normalmente dovrai continuare dopo un if .


2

se non si desidera utilizzare break, si aumenta semplicemente il valore di I in modo tale da rendere falsa la condizione di iterazione e il ciclo non verrà eseguito alla successiva iterazione.

for(int i = 0; i < list.Count; i++){
   if(i == 5)
    i = list.Count;  //it will make "i<list.Count" false and loop will exit
}

0

Come per altre lingue:

'VB
For i=0 To 10
   If i=5 then Exit For '= break in C#;
   'Do Something for i<5
next

For i=0 To 10
   If i=5 then Continue For '= continue in C#
   'Do Something for i<>5...
Next
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.