Знает ли CLR что-нибудь о событиях?

#.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 для присоединения к событию.

Таким образом, единственная специальная обработка, которую получают события, — это метаданные для удобства разработчика.