Sim, você definitivamente está perdendo alguma coisa . O Gotos normalmente seria usado, como você disse, para realizar uma transferência de controle unidirecional.
No entanto, eventos não fazem isso. Quando o código aciona o evento, ele sabe muito bem que, uma vez que o evento seja publicado (ou processado, enfileirado, acionado ... etc), a execução do código será retomada na linha seguinte do código que gerou o evento.
O uso de goto cria um acoplamento muito estreito entre o código que chama essa declaração e o código que está no lado receptor. O desenvolvedor precisa ter um conhecimento íntimo dos dois lugares para usar o goto.
Por outro lado, o código que aciona eventos normalmente não sabe nem se importa com quem está interessado em ouvir esse evento. Não poderia ser um ouvinte. Ou pode haver 100 ouvintes ou 0. Esses ouvintes podem estar no mesmo programa em que o evento foi acionado, ou podem estar em um aplicativo completamente diferente ou em uma máquina diferente. No que diz respeito ao editor, assim que ele gera o evento, seu trabalho é concluído.
Se você está comigo até agora, o que descrevi acima é o caso ideal de padrão pub / sub. Infelizmente, no mundo real, as coisas nem sempre são ideais e há casos em que os editores geram um evento, um assinante é chamado, muda todo um estado e, quando a execução do código retorna ao editor, "o mundo" parece ter foi virado de cabeça para baixo. E tenho certeza de que você já se deparou com isso no passado, porque essa condição geralmente surge quando o padrão pub / sub é implementado de uma maneira muito simples (por exemplo, através do uso de delegados ou eventos em C #, ou ponteiros de função / interface em C / C ++).
Mas esse problema não é necessariamente o padrão pub / sub, mas a implementação. É por isso que muitos sistemas dependem de filas para que, quando um evento for publicado, ele simplesmente seja enfileirado para ser chamado posteriormente, dando ao editor a chance de concluir a execução enquanto o mundo ainda está intacto. Quando o editor terminar o trabalho, um loop de evento (também conhecido como loop de expedição) sairá dos eventos e chamará os assinantes.
return
,try/catch
,break
,continue
,switch
- esses são todosgoto
com vários níveis de restrição construído em Goto considerado prejudicial é prejudicial para pensar sobre como o código funciona..