Cómo codificar una declaración de conmutación para probar dialogresult y proporcionar la lógica de caída
-
26-10-2019 - |
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).
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;