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).

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top