Как я понимаю, вы спрашиваете, как события работают под одеялом. Вы не указали, на каком языке/платформе вы спрашиваете, поэтому я собираюсь ответить тем, что знаю (.Net), хотя я уверен, что многие платформы похожи, помните, что то, что я говорю, может не быть истинно везде.
Я начну с самого низкого уровня и работаю вверх.
указатели на функции
В большинстве языков есть понятие указателя функции. В таких языках, как C++, вы можете буквально сохранить указатель на адрес памяти метода. В функциональных языках, таких как функции Lisp или F #, являются ключевыми, и это важная часть языка, на котором вы можете хранить и передавать ссылки на функции. В .net, указатели на функции реализуются с использованием делегатов.
Делегаты
В .Net мероприятия реализуются с помощью делегатов. A delegate - это указатель функции безопасного типа. Это указатель на функцию, которая ограничена определенным типом и проверяется на этот тип во время компиляции. Вы можете вызвать делегат, и он вызовет функцию, на которую указывает.
Multicast
multicast delegate это класс, который формирует коллекцию делегатов. Он использует внутренний список для хранения нескольких делегатов. Когда вы вызываете add
или делаете +=
, вы просто добавляете свой новый делегат (указатель функции) во внутренний список многоадресной рассылки. Многоадресные экземпляры делегатов могут запускаться, и он просто перемещается вниз по списку и запускает внутри каждого делегата в последовательности.
Событие
event только ключевое слово, которое добавляет несколько дополнительных ограничений на верхней части группового делегата, который подкрепляет событие. Например, с помощью ключевого слова event, когда вы объявляете экземпляр делегата многоадресной рассылки, он ограничивает его, чтобы он мог быть запущен только из класса, в котором он объявлен.
Итак, подведем итоги. События - это всего лишь список указателей на функции. Когда вы подписываетесь, вы просто добавляете указатель на свою функцию в список. Когда событие запускается, он просто перемещается вниз по списку и запускает каждый указатель функции, о котором он знает.
Очевидно, что, как я сказал в начале, каждый язык/среда будет отличаться, но я не удивлюсь, если идея поддержания простых списков указателей функций, вероятно, довольно распространена.
Джон Скит имеет отличную article on events in .Net, что вы должны читать для получения дополнительной информации, если это платформа вы заинтересованы.
На каком языке? – bmargulies
Не имеет значения. – Malfist