Statement continue in un ciclo for

by Andrea 05 February 2008 20:02

Navigando un pò su msdn.microsoft mi è capitato di imbattermi in uno statement che (ammetto) non conoscevo.

Se si vuole interrompere l'esecuzione di una parte di codice all'interno di un ciclo for, continuando comunque a ciclare gli item, ci viene in soccorso uno statement comodissimo, che si chiama continue.

Ad esempio, con il seguente codice:

for (int i = 1; i <= 10; i++) 
{
    if (i < 9) 
        continue//  <<-----
    Console.WriteLine(i);
}

verrrà renderizzato come output:

9
10

perchè l'istruzione continue eviterrà di eseguire la parte di codice posta tra questo statement e la fine del ciclo for (che in questo esempio corrisponde solamente a Console.WriteLine(i);).

Perchè posto una cosa così semplice?!
Il motivo è che fino all'altro giorno, quello che avrei fatto sarebbe stato racchiudere parte del codice all'interno di un if, e ad una determinata condizione non l'avrei eseguito.
Ma devo ancora decidermi su quale delle due metodologie sia più elegante e corretta. Secondo voi?

Links:
continue (C# Reference)
Jump Statements (C# Reference)

Technorati Tags: ,

Tags:

.NET

Comments

08/02/2008 06:02 #

Si può vivere anche senza continue e break, come si vive senza goto... Strutturare il codice con if... else... è sicuramente molto più leggibile che usare continue. E' un pò come quando si usa il return per uscire dall'interno di una procedura dopo aver testato alcune condizioni... succede che poi non sai più da che punto è uscita la procedura.

Davide Senatore |

08/02/2008 14:02 #

Un purista ti direbbe che "continue" e "break" sono statement da non usare perchè rendono meno leggibile il codice. Nel tuo particolare caso è più chiaro e leggibile invertire la condizione e mettere la write nell'if. Però ti confermo che ci sono alcuni casi (non frequenti, ma nemmeno rari) in cui sono indispensabili perchè ti aiutano a scrivere meno codice.

Andrea Boschin |

09/02/2008 01:02 #

Erano le risposte che mi aspettavo, e corrispondono al mio stesso pensiero.

Oggi (per curiosità) ho anche voluto fare una prova a disassemblare le 2 funzioni, una con il continue e una con l'if che racchiude tutto il codice.
Risultato? Il codice prodotto è praticamente identico, differisce di un'unica istruzione, che quello senza il continue ha un NOP (http://en.wikipedia.org/wiki/NOP) in più. Ed ecco quindi che l'uso dell'uno o dell'altro è puramente di lettura del codice. ;)
          

Andrea |

10/02/2008 04:02 #

non credo di aver capito il primo caso, ma il secondo si risolve molto meglio usando un metodo che isoli la logica di ricerca ( un metodo findElement() ). questo oltre a rendere il codice molto più leggibile ti apre la strada al riutilizzo del codice.

Andrea Boschin |

10/02/2008 12:02 #

Io sono meno purista e li uso frequentemente (dal c++).

Continue:
di solito nello scorrere un elenco di elementi su eseguire delle operazioni metto in testa al blocco di codice del ciclo le condizioni di skip del record, isolando di fatto le logiche di modifica



Break:
di solito sono iterazioni di ricerca di un elemento all'interno di un vettore, al primo match termino l'iterazione. Non c'e' altra logica nel ciclo.

Per quello che mi riguarda (parlo per esperienza personale) il codice resta pulito anche usando break e continue, basta evidenziare i differenti blocchi funzionali (anzi credo che la leggibilità ne guadagni).
          

Andrea Balducci |

13/02/2008 12:02 #

Primo caso: CONTINUE

for(...)
{
  // condizioni di skip
  if(......)
    continue;

  // logica applicativa
  Trasformazione1(...);
  Trasformazione2(...);
  
  // condizioni di skip
  if(......)
    continue;

  Trasformazione3(...);
  Trasformazione4(...);
  ...
}

Lo stesso risultato si ottiene con un if che racchiuda il blocco di trasformazioni. Di solito scelgo una opzione piuttosto che l'altra in base alla lunghezza e alla leggibilità dei vari blocchi (banalmente evito di indentare troppo il codice o di avere metodi con troppi argomenti che non verranno mai riutilizzati perchè specifici di una certa iterazione).


Secondo caso: BREAK
Stessa logica adottata per il continue, dipende tutto dalla complessità del codice e dalla effettiva leggibilità.


Se effettivamente ho logiche riutilizzabili vengono incapsulate in metodi generici, altrimenti ricorro a soluzioni break / continue per non "sporcare" la classe con metodi superflui.

Cerco di sempre di avere delle aree di codice ben definite, così a colpo d'occhio ho la suddivisione logica del flusso di elaborazione.
          

Andrea Balducci |

19/02/2008 18:02 #

Ma cioa, che bel blog che hai. Pensa che sono piombata da queste parti per caso, io ho un blog su Leonardo, e cercavo una poesia di Neruda. Vedo che sei un esperto di computer, io invece sono un'imbranata totale. Pensa che ho il pc di casa bloccato, non vedo niente sul monitor, ho messo il cd di windows per riavviarlo ma non succede niente, consigli? Vienimi a trovare dai.... ciao a presto da miss.

misspalestra |

Comments are closed