Как стать автором
Обновить

Комментарии 5

я крайне советую воспользоваться книгой «CLR via C#» за авторством Джеффри Рихтера
Полностью поддерживаю, прекрасная книга. Само собой, если уровень английского позволяет, лучше читать в оригинале.
Лучше еще и по той причине, что при переводе некоторые моменты из книги попросту взяли и выкинули.
Перво-наперво: события (event) не являются экземплярами делегатов. А теперь снова:
События — это НЕ экземпляры делегатов.

В некотором смысле жаль, что язык C# позволяет использовать события и экземпляры делегатов в определённых ситуациях одинаковым образом, однако очень важно понимать разницу.

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

Определение, которому я всегда доверял:
Событие — это специализированный делегат, позволяющий сторонним объектам только подписываться или отписываться, по сути — формализация паттерна «Наблюдатель».
Вообще, вы подняли интересную проблему. С точки зрения Джона Скита (насколько я понял его точку зрения, и насколько я могу судить от его имени) события — это не делегаты, но оболочки вокруг экземпляров делегатов, которые предоставляют им (экземплярам) дополнительный функционал. В подтверждение этому автор проводит аналогию между делегатами/событиями с одной стороны и полями/свойствами с другой.

Вместе с тем, русскоязычный MSDN утверждает:
События это особый тип многоадресных делегатов, которые можно вызвать только из класса или структуры, в которой они объявлены (класс издателя).
Это дословный перевод с англоязычного:
Events are a special kind of multicast delegate that can only be invoked from within the class or struct where they are declared (the publisher class).

Моя же личная (в отрыве от статьи) точка зрения такова, что это игра терминами, наподобие полупустого/полузаполненного стакана: компилятор разворачивает field-like событие в поле делегата и методы add/remove, а то, будем ли мы называть такое событие разновидностью делегата, или же самостоятельной сущностью, ключевой роли уж не играет.
события — это не делегаты, но оболочки вокруг экземпляров делегатов, которые предоставляют им (экземплярам) дополнительный функционал.

Скорее навешивают ограничения на делегат. Я считаю главным отличием делегата от ивента то, что ивент доступен всем для подписки, но вызвать его можно только из класса, являющегося собственником этого ивента. Я бы сказал, что event чем-то похож на модификатор доступа для делегатов.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации