Cómo codificar una declaración de conmutación para probar dialogresult y proporcionar la lógica de caída

StackOverflow https://stackoverflow.com/questions/5331090

Pregunta

Estoy obteniendo resultados extraños probando el valor de retorno de una función. Este código está dentro de un bucle for:

DialogResult result = EvalReturnFromWS(returnMsg);
     switch (result)
     {
         case DialogResult.Yes:
         case DialogResult.No:
              continue;
         default:
              break;
     } 

Aquí hay un fragmento de la función llamada (en mi prueba de unidades, siempre hago clic en el botón "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;
    }

Cuando hago clic en "sí", devuelve dialogresult.yes pero de vuelta en el código de llamada, la ejecución fluye al segundo caso que es "no" y esto continúa, que es lo que no pretendo.

En otra parte de StackOverflow, vi un hilo que sugirió codificar un caso de "caída" como lo tengo para Dialogresult. Sí, serviría para caer.

En resumen, en caso afirmativo, quiero reanudar la ejecución con la siguiente declaración después del final de las casos del conmutador. Es decir, "caer".

Editar - Perdón por la confusión. Sí, el fragmento superior está dentro de un bucle for. El segundo fragmento está dentro de la función llamada (ese código emite MessageBox.show).

¿Fue útil?

Solución

Lo que quieres hacer es poner break; en el DialogResult.Yes caso. No quieres que caiga en este 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
 }

Caer medios significa que la ejecución se mueve de uno case declaración al siguiente. No tiene nada que ver con la ejecución que abandona el switch declaración. En tu ejemplo, el break; por debajo default:, sale de ese bloque de código (el conmutador, no el bucle) y continúa la ejecución después del switch declaración. Nuevamente, no sale del bucle exterior. Esto es porque break; es una palabra clave dentro de los casos de conmutación que detiene una mayor ejecución del bloque de casos de conmutador. Sin embargo, continue; Continuará el bucle porque no es algo utilizado dentro de un caso de interruptor.

Intente ejecutar este código de ejemplo:

for (int i = 0; i < 3; i++) {
    switch (i) {
        case 0:
        case 2:
            continue;
        default:
            break;
    }
    Console.Out.WriteLine(i);
}

Solo saldrá 1 Porque para los casos i=0 y i=2, el bucle continúa. En caso i=1 La ejecución llega a Console.Out.WriteLine(i);.

Editar
Y, si desea salir del bucle desde su interruptor, vea esta pregunta: Salir de un bucle anidado

Otros consejos

¿Está esto en un bucle? Esa es la única razón por la que puedo verte usando 'Continuar' después de No. Efectivamente, apilando las opciones de casos de esa manera sí y no hará lo mismo. Si quieres 'sí' solo 'caer' después de que el interruptor haga esto

case DialogResult.Yes:
    break;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top