События предоставляют другим объектам уведомления о различных случаях, таких как нажатие кнопки или успешное выполнение метода. События определяются и
переключаются с помощью делегатов.
События позволяют классу или объекту уведомлять другие классы или объекты о возникновении каких-либо ситуаций.
Событийно-ориентированное программирование, как правило, применяется в трех случаях:
- При построении пользовательских интерфейсов (в том числе графических);
- При создании серверных приложений в случае, если по тем или иным причинам нежелательно порождение обслуживающих процессов;
- При программировании игр, в которых осуществляется управление множеством объектов.
Для работы события, необходимо подготовить три следующих элемента:
- Класс, предоставляющий данные для события.
- Делегат события.
- Класс, порождающий событие.
В C# событие объявляется ключевым словом event. Каждому члену событию определяется область действия (практически всегда он открытый, поэтому доступен из любого кода), тип делегата, указывающий на прототип вызываемого метода (или методов), и имя (любой допустимый идентификатор).
Для объявления события в классе издателе, используется ключевое слово event
События имеют следующие свойства:
- Издатель определяет момент вызова события, подписчики определяют предпринятое ответное действие.
- У события может быть несколько подписчиков. Подписчик может обрабатывать несколько событий от нескольких издателей.
- События, не имеющие подписчиков, никогда не возникают.
- Обычно события используются для оповещения о действиях пользователя, таких как нажатия кнопок или выбор меню и их пунктов в графическом пользовательском интерфейсе.
- Если событие имеет несколько подписчиков, то при его возникновении происходит синхронный вызов обработчиков событий.
Сигнатура обработчика событий должна соответствовать следующим соглашениям:
1 2 3 |
private void button_Click(object sender, EventArgs e) { } |
Метод обработчик события принимает ровно два параметра.
- Первый параметр называется sender и имеет тип object . Это объект, вызвавший событие.
- Второй параметр называется — e и имеет тип EventArgs или тип производного класса от EventArgs . Это данные, специфичные для события. Тип возвращаемого значения метода обработчика — void.
Регистрация события происходит с помощью операций += и -= . Эти операции и вызывают на самом деле выполнение методов Add_.Event() и Remove_.Event() . Последний метод отключает обработку события.
1 |
MyEvent += Method; |
Контекстно-зависимое ключевое слово add используется для определения пользовательского метода доступа к событию, вызываемому при подписке клиентского кода к событию. Если указан пользовательский метод доступа add , то необходимо также указать метод доступа remove .
1 2 3 4 5 |
public event EventDelegate MyEvent { add { myEvent += value; } remove { myEvent -= value; } } |
Для чего же нужна такая запутанная конструкция с add и remove ? А все очень просто, в скобках у нас есть возможность создать условие при котором произойдет подписка или отписка к событию. Вот пример:
1 2 3 4 5 |
public event EventDelegate MyEvent { add { if(1<2)myEvent += value; } remove { if(2<1)myEvent -= value; } } |
Таким образом мы создали условие при котором произойдет подписка или отписка от события. Однако для такой конструкции требeется создать свойство myEvent;
1 |
EventDelegate myEvent = null; |
- События это особый тип многоадресных делегатов, которые можно вызвать только из класса или структуры, в которой они объявлены (класс издателя). Если на событие подписаны другие классы или структуры, их методы обработчиков событий будут вызваны, когда класс издателя инициирует событие.
- События можно пометить как открытые (public), закрытые (private), защищенные (protected), внутренние (internal) или protected internal.
- Событие можно объявить как статическое событие при помощи ключевого слова static. При этом событие становится доступным для вызова в любое время, даже если экземпляр класса отсутствует.
- Событие может быть помечено как виртуальное событие при помощи ключевого слова virtual. Это позволяет производным классам переопределять поведение события при
помощи ключевого слова override. - События могут быть абстрактными.