Sí, definitivamente te estás perdiendo algo . Gotos normalmente se usaría, como dijiste, para realizar una transferencia de control unidireccional.
Sin embargo, los eventos no hacen eso. Cuando el código dispara el evento, sabe muy bien que una vez que se publica el evento (o se procesa, se pone en cola, se dispara ... etc.) la ejecución del código se reanudará en la línea siguiente del código que generó el evento.
El uso de goto crea un acoplamiento muy estrecho entre el código que llama a esa declaración y el código que está en el extremo receptor. El desarrollador debe tener un conocimiento íntimo de ambos lugares para poder usar goto.
Por otro lado, el código que dispara eventos generalmente no sabe o no le importa quién está interesado en escuchar ese evento. No podría ser un oyente. O podría haber 100 oyentes o 0. Esos oyentes podrían estar en el mismo programa donde se activó el evento, o podrían estar en una aplicación completamente diferente, o podrían estar en una máquina diferente. En lo que respecta al editor, tan pronto como genera el evento, su trabajo está hecho.
Si estás conmigo hasta ahora, lo que describí anteriormente es el caso ideal de patrón de pub / sub. Desafortunadamente, en el mundo real, las cosas no siempre son ideales y hay casos en los que los editores generan un evento, se invoca a un suscriptor, cambia un montón de estado y para cuando la ejecución del código vuelve al editor, "el mundo" parece tener sido puesto boca abajo. Y estoy seguro de que te has encontrado con esto en el pasado, porque esta condición a menudo surge cuando el patrón pub / sub se implementa de una manera muy simple (por ejemplo, mediante el uso de delegados o eventos en C #, o punteros de función / interfaz en C / C ++).
Pero este problema no es necesariamente un patrón pub / sub, sino más bien la implementación del mismo. Esta es la razón por la cual muchos sistemas dependen de las colas para que cuando se publique un evento, simplemente se ponga en cola para ser invocado más tarde, lo que le da al editor la oportunidad de finalizar la ejecución mientras el mundo aún está intacto. Cuando el editor termine de hacer su trabajo, un bucle de eventos (también conocido como bucle de despacho) mostrará los eventos e invocará a los suscriptores.
return
,try/catch
,break
,continue
,switch
- esas son todasgoto
con diferentes niveles de restricción incorporada en Goto considera perjudicial es perjudicial para pensar acerca de cómo funciona el código..