statement - switch case c#
romper en un caso con devoluciĆ³n... y por defecto (13)
Como han señalado otros, colocar un descanso después de una devolución o en el caso predeterminado es principalmente una cuestión de estilo personal.
Cuando no tengo que seguir ninguna regla de estilo específica, prefiero algo como esto:
switch(foo){ case 0: baz = 1; break; case 1: bar %= 2; return -1; /* NOTREACHED */ case 2: bar = -1; return -2; /* NOTREACHED */ break; default: break; }
Entre los casos 1 y 2, tiendo a preferir 2. Aunque el comentario dice NOTREACHED, los comentarios pueden mentir (involuntariamente por supuesto) cuando el código cambia. Me gusta el comentario NOTREACHED, ya que puede satisfacer la pelusa de que sabe lo que está haciendo y sirve como recordatorio de que sale de la función antes. El razonamiento de que poner un descanso después de la devolución mitigará los errores si se cancela la devolución me parece erróneo. Todavía obtendrá un comportamiento falso independientemente de si pasa al siguiente caso o si sale del interruptor y continúa como antes.
Por supuesto, si puedo evitarlo, no regresaría de una función dentro del cuerpo de un interruptor.
Mi OCD me hace agregar "break" al escribir las declaraciones de casos, incluso si no se ejecutarán. Considere el siguiente ejemplo de código:
switch(option) {
case 1:
a = 1;
b = 7;
break;
case 2:
a = 2;
b = 4;
return (-1);
break;
default:
a = -1;
break;
}
Mis dos preguntas son:
Para "caso 2:", realmente no necesito el descanso, ¿pero es una buena idea tenerlo allí de todos modos? Para "predeterminado:". ¿Es puramente TOC, o hay alguna razón real para tener el descanso aquí?
Considero que la ruptura después del retorno es mala, recibirás advertencias sobre el código inalcanzable en algunos compiladores.
La interrupción en su caso predeterminado es completamente apropiada, la caída del caso es una herramienta y debe ser especialmente marcada cuando se usa.
Disculpe mi conocimiento limitado, pero ¿qué es el TOC?
Aparte de eso, Brian Kernighan proporciona una buena explicación sobre cuándo debe (no) utilizar la break
dentro de una declaración de switch
.
El descanso después de su caso predeterminado es solo una cuestión de preferencia personal.
Hacer un descanso después del regreso casi me parece contradictorio. Quitaría el descanso, solo para hacer que la declaración de retorno realmente se destaque.
En cuanto al comentario que otros han hecho, dejan el receso en el caso predeterminado en caso de que alguien venga más tarde y agregue un caso después de él: donde trabajo, el estándar de codificación dice que siempre coloque el valor predeterminado como el último caso; Entonces, en nuestra situación, una ruptura en ese caso es simplemente redundante. (Este es un caso en el que estoy totalmente de acuerdo con el estándar de codificación de la compañía, porque con el caso predeterminado siempre siendo el último, siempre se sabe dónde encontrarlo, incluso en una declaración de conmutación larga).
En cuanto a las interrupciones después de los retornos, tiendo a omitir la ruptura a menos que haya alguna ruta de ejecución que no retorna, ya que la considero redundante. (Mi excepción a esto es que, en las raras ocasiones en que hay varias rutas de ejecución en un caso y no puedo decir con un escaneo rápido del código si regresan o no, entonces dejaré el receso solo para cuidate.)
En este ejemplo exacto, para ambas preguntas, es una preferencia personal. En general, la regla es la siguiente: todo lo que no tenga interrupción se perderá. Eso significa (como dijo Pod) es una buena idea poner descansos en los casos predeterminados en caso de que no sean los últimos. Esto también significa que si su caso contiene una devolución, entonces una ruptura siguiente no es necesaria.
Estoy de acuerdo con tener un descanso en un caso predeterminado final, y no estoy de acuerdo con los descansos después de las devoluciones. (Un colega hace eso y me lastima los ojos.)
También modifico los interruptores para reducir la proliferación de niveles de indentación. :) es decir:
switch(option) {
case 1:
a = 1;
b = 7;
break;
case 2:
a = 2;
b = 4;
return -1;
default:
a = -1;
break;
}
(También creo que, dado que la declaración de devolución no es una función, no es apropiado imponer un estilo superfluo que lo haga parecer uno).
Me dicen que en C, C ++, Java y C #, si no pone esos "cortes", el flujo de código del programa caerá en los otros "casos" y ejecutará las instrucciones dentro de ellos, no importa si la variable no lo hace No tienen los valores asignados a los "casos".
Ninguna pausa hace nada por ti, pero tampoco perjudica.
Personalmente, generalmente los dejo fuera si tengo una devolución, pero también trato de evitar tener múltiples puntos de retorno en una función si es posible.
Sin embargo, creo que la ruptura en el default:
caso es bueno, por una razón: si lo dejaras fuera y alguien añadiera un nuevo caso después del incumplimiento: el comportamiento sería diferente si "olvidaran" agregar un descanso.
No necesitas ningún descanso, pero no hay daño en tenerlos. En mi opinión, mantener el código estructurado vale la pena tener un par de declaraciones extrañas.
Personalmente no aprovecho los descansos, pero podría ser útil cuando alguien más decide mover la devolución (-1) fuera del interruptor y se olvida de agregar un descanso.
Pondré el descanso para mostrar que no tiene la intención de pasar al siguiente caso.
Prefiero siempre tener un descanso en cada caso, incluido el predeterminado y evitar hacer el retorno en absoluto dentro de los interruptores . Para interruptores cortos con solo 2-3 casos (incluido el predeterminado), el retorno está bien, pero solo si todas las cajas lo hacen de la misma manera. "sin sentido", lo veo como inútil y solo lo hago más código para leer. Lo mismo ocurre con los valores predeterminados vacíos que simplemente se rompen, totalmente sin sentido. La facilidad de leer el código es en mi opinión más importante que lo que sucede si alguien cambia esto o lo otro.