#.net #events #delegates #clr #il
#.net #Мероприятия #делегаты #clr #il #среда clr
Вопрос:
Мне кажется, что события — это манипуляция .NET в среде CLR. То есть в IL нет понятия «Событие» или команды, а языки программирования (такие как C #) используют делегаты для достижения поведения событий (которые являются просто объектами) таким образом, что с точки зрения среды CLR событий нет, просто обычныймеханизм делегирования. Это правда, или CLR ДЕЙСТВИТЕЛЬНО имеет какое-то особое отношение к событиям?
Ответ №1:
CLR, безусловно, осведомлен о событиях. Они присутствуют в метаданных сборки, поддержка отражения, встроенная в среду CLR, предоставляет их. Его интерфейсы отладчика предоставляют информацию о событиях отладчику. Сопоставление событий, объявленных в объявлении [ComVisible] C #, с интерфейсами приемника событий COM обеспечивается встроенной в CLR поддержкой взаимодействия CLR.
Но, возможно, все это можно считать просто поддержкой инфраструктуры. Черепахи на всем пути вниз, среда CLR не участвует в подписке и запуске событий напрямую, только делегат. Это важно, это должно быть быстро. В противном случае основное поведение среды CLR заключается в том, что она включается только тогда, когда это абсолютно необходимо.
Ответ №2:
Вы совершенно правы.
Событие — это просто пара методов с именами add_EventName
и remove_EventName
.
Единственная информация CLR о них — это существование EventInfo
класса для отражения и метаданных, которые его поддерживают (в частности, ссылки на эти методы и атрибуты).
Комментарии:
1. «События являются манипуляцией .NET в среде CLR» полностью корректно? Я бы сказал, что это скорее компилятор, а не манипулирование средой выполнения… Возможно, пример того, как события переписываются, может быть более наглядным для OP?
2. @Will: я имел в виду его второе предложение.
Ответ №3:
События понимаются средой CLR. Они присутствуют в скомпилированных сборках в виде метаданных.
Событие включает в себя пару методов с именами add_EventName
и remove_EventName
. С точки зрения реализации эти методы вызываются как любой другой метод. Нет инструкции IL для присоединения к событию.
Таким образом, единственная специальная обработка, которую получают события, — это метаданные для удобства разработчика.