remarks cref c# switch-statement break

cref - remarks c#



¿Por qué C#se rompe si no es opcional? (4)

Básicamente para que sea más familiar para los desarrolladores de C / C ++ / Java. Personalmente creo que fue un error, pero ese es el razonamiento.

Hubiera preferido un bloqueo forzado:

case ''1'': { }

Aparte de cualquier otra cosa, eso habría evitado las extrañas situaciones de alcance variable para interruptor / caja. Todavía puede tener múltiples etiquetas de casos, por supuesto:

case ''0'': case ''1'': { }

También podría ser bueno poder enumerar varios casos más simplemente:

case ''0'', ''1'': { }

Ah, y un pequeño comentario sobre su descripción del idioma existente: no tiene que tomarse un descanso. Es solo que el final del caso tiene que ser inalcanzable. También puede tener throw , goto o return . Puede haber otros que me he perdido, también :)

Esta pregunta ya tiene una respuesta aquí:

Cuando creo una instrucción switch en VS2008 C # como esta (ideada):

switch (state) { case ''1'': state = ''2''; case ''2'': state = ''1''; }

se queja de que no puedo pasar por alto:

El control no puede pasar de una etiqueta de caso (''case'' 1 ''(0x31):'') a otra

Si no puede pasar, ¿cuál es el propósito de la declaración de break ? ¿Por qué los diseñadores de idiomas no lo omitieron y saltaron automáticamente al final de la declaración de cambio en lugar de forzarnos a poner en una construcción innecesaria?


De la boca del caballo (MSDN) ¿Por qué la declaración del interruptor C # está diseñada para no permitir la caída, pero aún así requiere un descanso? .

Citando los bits sobresalientes, esta es la razón por la cual no permiten la caída:

Este comportamiento de caída implícita se usa a menudo para reducir la cantidad de código necesario y, a menudo, no es un problema la primera vez que se escribe ese código. Sin embargo, a medida que el código pasa de la fase de desarrollo inicial a la fase de mantenimiento, el código anterior puede generar errores sutiles que son muy difíciles de depurar. Estos errores son el resultado del error muy común del desarrollador al agregar un caso, pero olvidando poner un descanso al final del bloque.

En C #, la instrucción switch requiere que el control de flujo explícito ocurra al final de un caso, ya sea un break, goto, return o throw. Si el desarrollador desea una semántica fallida, puede lograrse mediante un goto explícito al final de una declaración de caso.

Y es por eso que no es automático:

Como resultado de las reglas de C # que requieren que el control de flujo explícito ocurra al final de un bloque de casos (generalmente un descanso), muchas personas se preguntan por qué el comportamiento simplemente no se modificó de modo que no se produjo el fracaso. Es decir, no haga que se requiera descanso, simplemente cambie la semántica del interruptor para no tener fallas en los casos. La razón por la que esto no se hizo fue para que los desarrolladores que estaban muy acostumbrados a C ++ no tuvieran dificultades para entender lo que estaba haciendo una declaración de cambio.


Puede pasar, pero tiene que hacerlo explícitamente con la palabra clave goto :

switch (state) { case ''1'': state = ''2''; goto case ''2''; case ''2'': state = ''1''; break; }

Puede break o goto C #, pero lo que no puede hacer es no indicar cuál desea, porque esa es una fuente potencial de errores difíciles de detectar.

Es mucho más fácil detectar que tu código dice " goto cuando querías un break (o viceversa), además de detectar que olvidaste agregarlo.

Puede sonar estúpido, pero muchas búsquedas de dos horas para la causa de un error de C ++ terminan en una repentina comprensión de que olvidaste agregar un break y tu código está cayendo todo el tiempo. C # lo evita al forzarte a decir lo que quieres.


Si no tiene ningún código en el caso 1, puede fallar, entonces puede decir que "todos estos casos comparten este código"