Ответы с форумов MSDN

События и делегаты в C#

Date: 25.12.2017 9:34:24

Событие, в плане генерируемого компилятором кода, состоит из двух частей: поле (многоадресный делегат) и пара методов для доступа к нему ("Добавить" и "Удалить", эквивалентные операторам += и -=).

Объявление public-события делает методы доступа открытыми, но само поле делегата делается private. Поэтому его можно прибавить/убавить, но не вызвать делегат напрямую. Это необходимо для соблюдения принципов ООП, если бы к делегату любого события можно было получить доступ напрямую, царил бы полный хаос. См. здесь более подробное объяснение.



Message 580

Date: 25.12.2017 10:11:20

Event по сути является только оберткой для этих двух методов доступа. Любые другие операции к нему не применимы. Поэтому компилятор все обращения к MyEvent, кроме += и -=, может автоматически воспринимать как обращения к field - неоднозначности тут нет.

Message 579

Date: 25.12.2017 10:58:33

1. Да, так как вызывается вполне определенный метод (Delegate.Combine, Delegate.Equals, ...), известный на этапе компиляции. Позднее связывание возникает при вызове абстрактного метода или использовании reflection.

2. Не могу прокомментировать "механизм событий прописан на IL, короче, аналогично на C# такого не описать", я не настолько специалист в этом. Видимо, дело в том, что на уровне IL event - это вообще не поле, а просто контейнер для методов add/remove. Конфликта нету, потому что это разные вещи. Обращение к += (снаружи класса) на уровне IL становится просто вызовом пользовательского add-метода. А какой-то специальной операции "подписка на событие" на низком уровне нету.


Автор: VadimTagil

Главная страница - Список тем - Репозиторий на GitHub