Me preguntaba si alguien todavía usa la sintaxis de la palabra clave "goto" en C # y qué posibles razones existen para hacerlo.
Tiendo a ver cualquier declaración que haga que el lector salte el código como una mala práctica, pero me preguntaba si había escenarios creíbles para usar tal sintaxis.
c#
.net
coding-style
goto
Brian Scott
fuente
fuente
goto
romper un bucle y volver a la declaración inicial de acuerdo con una condición específicaRespuestas:
Hay algunos casos (raros) en los que goto puede mejorar la legibilidad. De hecho, la documentación a la que vinculó enumera dos ejemplos:
Aquí hay un ejemplo para el último:
Por supuesto, también hay otras formas de solucionar este problema, como refactorizar el código en una función, usar un bloque ficticio a su alrededor, etc. (consulte esta pregunta para obtener más detalles). Como nota al margen, los diseñadores del lenguaje Java decidieron prohibir goto por completo e introducir una declaración de ruptura etiquetada en su lugar.
fuente
Recuerdo esta parte
A algo como esto
Refiera esto
fuente
Lo uso extensamente en Eduasync para mostrar el tipo de código que el compilador genera para usted cuando usa métodos asíncronos en C # 5. Vería lo mismo en bloques iteradores.
Sin embargo, en el código "normal", no recuerdo la última vez que lo usé ...
fuente
goto es genial para romper muchos bucles donde break no funcionaría bien (digamos en condiciones de error), y como Kragen dijo, el compilador usa goto para generar declaraciones de cambio y algunas otras cosas también.
fuente
No recuerdo haber usado nunca
goto
. Pero tal vez mejore la intención de un bucle para siempre del que realmente nunca querrás salir (nobreak
, pero aún puedesreturn
othrow
):Por otra parte, un simple
while (true)
debería ser suficiente ...Además, puede usarlo en una situación en la que desee que la primera iteración de un bucle comience en el medio del bucle: busque aquí un ejemplo.
fuente
goto
.. ywhile(true) {..}
no es un uso interesante ..El compilador usa
goto
declaraciones en varias piezas de código generado, por ejemplo, en tipos de bloques de iteradores generados (generados cuando se usa layield return
palabra clave; estoy bastante seguro de que los tipos de serialización XML generados también tienen algunasgoto
declaraciones allí en algún lugar también.Consulte Detalles de implementación del bloque Iterator: máquinas de estado generadas automáticamente para obtener más detalles sobre por qué / cómo el compilador de C # maneja esto.
Aparte del código generado, no hay una buena razón para usar una
goto
declaración en el código normal; hace que el código sea más difícil de entender y, como resultado, más propenso a errores. Por otro lado, usargoto
declaraciones en el código generado como este puede simplificar el proceso de generación y normalmente está bien porque nadie va a leer (o modificar) el código generado y no hay posibilidad de que se cometan errores porque una máquina está escribiendo.Vea la declaración Go-to considerada dañina para un argumento en contra
goto
, así como una pieza clásica de la historia de la programación.fuente
goto
no. Algo a considerar.El procesador implementa al menos una instrucción de salto y estoy seguro de que muchas declaraciones las usan en su implementación o interpretación.
Una de las cosas buenas de usar un lenguaje de tercera o cuarta generación es que estos detalles físicos se abstraen de nosotros. Si bien deberíamos tener en cuenta la ley de la abstracción con fugas , creo que también deberíamos usar nuestras herramientas como están diseñadas (lo siento ). Si estuviera escribiendo código y me
goto
pareciera una buena idea, sería hora de refactorizar. El propósito de un lenguaje estructurado es evitar estos "saltos" y crear un flujo lógico en nuestra ingeniería.Debería evitar el uso de,
break
pero no puedo pasar por alto el beneficio de rendimiento. Sin embargo, si tengo bucles anidados que se necesitan mutuamentebreak
, es hora de refactorizar.Si alguien puede proponer un uso de
goto
eso que parece mejor que refactorizar, con mucho gusto retiraré mi respuesta.Espero no ser culpable de correr al " cobertizo de bicicletas " aquí. Como dice Kragen, lo que es lo suficientemente bueno para Dijkstra es lo suficientemente bueno para mí.
fuente
dynamic
objeto y caminando por su gráfico de objetos que contiene varios diccionarios para llegar a los valores que necesito. No tiene sentido usar métodos que tienen un parámetro dedynamic
esperar una forma de objeto exacta. Con goto para romper varias capas y continuar caminando a través de una colección de estos objetos. [No soy dueño de los tipos, así que no puedo proporcionar un mejor acceso, así que la reflexión o la dinámica son]Goto nunca es mejor. Y continuar, romper (excepto en caso de cambio / caso), retorno (múltiple) y lanzamiento también deben mantenerse al mínimo. Nunca querrás escapar del medio de los bucles del nido. Siempre quiere que las sentencias de control de bucle tengan todo el control de bucle. La sangría tiene información, y todas estas declaraciones desechan esa información. También puede quitar todas las sangrías.
fuente