Come codificare un'istruzione switch per prova DialogResult e fornire caduta attraverso la logica
-
26-10-2019 - |
Domanda
sto ottenendo strani risultati di test il valore restituito da una funzione. Questo codice si trova all'interno di un ciclo for:
DialogResult result = EvalReturnFromWS(returnMsg);
switch (result)
{
case DialogResult.Yes:
case DialogResult.No:
continue;
default:
break;
}
Ecco un frammento della funzione chiamata (nella mia unità test ho sempre clic sul pulsante "sì"):
DialogResult result = MessageBox.Show(mbText.ToString(), caption, button, icon);
switch (result)
{
case DialogResult.Yes:
return DialogResult.Yes;
case DialogResult.No:
return DialogResult.No;
case DialogResult.Cancel:
return DialogResult.Cancel;
}
Quando faccio clic su "Sì" restituisce DialogResult.Yes ma torna nel codice chiamante, l'esecuzione scorre verso il 2 ° caso, che è "no", e questo fa un continua che è quello che non intendono.
Altrove su StackOverflow, ho visto un filo che suggerisce la codifica di un caso "fall-through", come ho per DialogResult.Yes servirebbe a cadere.
In breve, se sì, voglio per riprendere l'esecuzione con l'istruzione successiva dopo la fine del caso dell'interruttore (s). Cioè, "cadere attraverso".
Modifica - dispiace per la confusione. Sì, il frammento superiore è all'interno di un ciclo for. Il secondo frammento è all'interno della funzione chiamata (che problemi di codice MessageBox.Show).
Soluzione
Che cosa si vuole fare è mettere break;
nel caso DialogResult.Yes
. Non si vuole che cada attraverso in questo caso.
switch (result)
{
case DialogResult.Yes:
break; //Leaves the switch statement and continues executing code
case DialogResult.No:
continue; //Moves to next iteration of loop
default:
break; //Leaves the switch statement and continues executing code
}
Autunno attraverso mezzi che l'esecuzione si sposta da una dichiarazione case
a quello successivo. Non ha nulla a che fare con l'esecuzione di lasciare la dichiarazione switch
. Nel tuo esempio, il break;
sotto default:
, scoppia di quel blocco di codice (l'interruttore, non il loop) e continua l'esecuzione dopo l'istruzione switch
. Anche in questo caso, non si rompe fuori dal ciclo esterno. Questo perché break;
è una parola chiave all'interno casi Interruttore che arresta un'ulteriore esecuzione del blocco caso interruttore. Tuttavia, continue;
continuerà il ciclo, perché non è qualcosa di usato all'interno di un caso di interruttore.
Provare a eseguire questo codice di esempio:
for (int i = 0; i < 3; i++) {
switch (i) {
case 0:
case 2:
continue;
default:
break;
}
Console.Out.WriteLine(i);
}
Si 1
uscita solo perché per la casi i=0
e i=2
, il ciclo prosegue. Per il caso di esecuzione i=1
rende a Console.Out.WriteLine(i);
.
Modifica
E, se si vuole uscire dal giro da dentro lo switch, vedere questa domanda: rottura di un ciclo annidato
Altri suggerimenti
E 'questo in un ciclo? Questo è l'unico motivo che posso vederti usando 'continuare' dopo No. Certo, basta, impilando le opzioni di casi in questo modo sì e no farà la stessa cosa. Se si vuole 'Sì' per solo 'caduta attraverso' dopo il passaggio fare questo
case DialogResult.Yes:
break;