Sì, sicuramente ti stai perdendo qualcosa . In genere, i goto vengono utilizzati, come hai detto, per eseguire un trasferimento di controllo unidirezionale.
Tuttavia, gli eventi non lo fanno. Quando il codice genera l'evento, sa perfettamente che una volta che l'evento viene pubblicato (o elaborato, messo in coda, attivato ... ecc.) L'esecuzione del codice riprenderà sulla riga successiva del codice che ha generato l'evento.
L'uso di goto crea un accoppiamento molto stretto tra il codice che chiama quell'istruzione e il codice che si trova sull'estremità ricevente. Lo sviluppatore deve avere una conoscenza intima di entrambi i luoghi per poter usare goto.
D'altra parte, il codice che genera eventi in genere non conoscerebbe o preoccuperebbe chi è interessato ad ascoltare l'evento. Ci potrebbe essere un ascoltatore. Oppure potrebbero esserci 100 ascoltatori o 0. Questi ascoltatori potrebbero essere nello stesso programma in cui è stato generato l'evento, oppure potrebbero trovarsi in un'applicazione completamente diversa o potrebbero trovarsi su una macchina diversa. Per quanto riguarda l'editore, non appena genera l'evento, il suo lavoro è terminato.
Se sei con me finora, quello che ho descritto sopra è il caso ideale di pub / sottotitoli. Sfortunatamente nel mondo reale le cose non sono sempre ideali e ci sono casi in cui gli editori generano un evento, un abbonato viene invocato, cambia un sacco di stati e quando l'esecuzione del codice temporale ritorna all'editore "il mondo" sembra avere stato capovolto. E sono sicuro che ti sei imbattuto in questo in passato, perché questa condizione si presenta spesso quando il modello pub / sub viene implementato in un modo molto semplice (ad esempio tramite l'uso di delegati o eventi in C # o puntatori di funzione / interfaccia in C / C ++).
Ma questo problema non è necessariamente pub / sub pattern ma piuttosto la sua implementazione. Questo è il motivo per cui molti sistemi si basano su code in modo che quando un evento viene pubblicato, viene semplicemente messo in coda per essere richiamato in seguito, dando all'editore la possibilità di terminare l'esecuzione mentre il mondo è ancora intatto. Quando l'editore ha finito di farlo, un ciclo di eventi (noto anche come ciclo di invio) farà scattare gli eventi e invocherà gli abbonati.
return
,try/catch
,break
,continue
,switch
- queste sono tuttegoto
con vari livelli di restrizione costruito in Goto considerato nocivo è dannoso per pensare a come le opere di codice..