Да, вы определенно что-то упускаете . Как вы сказали, Gotos обычно используется для односторонней передачи управления.
Однако события этого не делают. Когда код запускает событие, он прекрасно знает, что как только событие будет опубликовано (или обработано, поставлено в очередь, запущено ... и т. Д.), Выполнение кода возобновится со следующей строки кода, сгенерировавшего событие.
Использование goto создает очень тесную связь между кодом, который вызывает этот оператор, и кодом, который находится на принимающей стороне. Разработчик должен иметь глубокие знания обоих мест, чтобы использовать goto.
С другой стороны, код, который запускает события, обычно не знает или не заботится о том, кто заинтересован в прослушивании этого события. Там может быть слушатель. Или может быть 100 слушателей или 0. Эти слушатели могут быть в той же программе, где было запущено событие, или они могут быть в совершенно другом приложении, или они могут быть на другой машине. Что касается издателя, как только он генерирует событие, его работа завершена.
Если вы до сих пор со мной, то, что я описал выше, является идеальным примером паттерна pub / sub. К сожалению, в реальном мире вещи не всегда идеальны, и есть случаи, когда издатели генерируют событие, подписчик вызывается, изменяет целый набор состояний и к тому времени, когда выполнение кода возвращается обратно к издателю, «мир», кажется, имеет был перевернут с ног на голову. И я уверен, что вы сталкивались с этим в прошлом, потому что это условие часто возникает, когда шаблон pub / sub реализуется очень простым способом (например, посредством использования делегатов или событий в C #, или указателей на функции / интерфейс в C / C ++).
Но эта проблема не обязательно шаблон паб / суб, а скорее ее реализация. Вот почему многие системы полагаются на очереди, поэтому, когда событие публикуется, оно просто ставится в очередь для последующего вызова, что дает издателю шанс завершить выполнение, пока мир еще не поврежден. Когда издатель выполнит свою работу, цикл событий (он же диспетчерский цикл) выскочит из событий и вызовет подписчиков.
return
,try/catch
,break
,continue
,switch
- те всеgoto
с различными уровнями ограничения , построенного в Гото считается вредным вредно думать о том , как работает код..