События

События предоставляют другим объектам уведомления о различных случаях, таких как нажатие кнопки или успешное выполнение метода. События определяются и
переключаются с помощью делегатов.

События позволяют классу или объекту уведомлять другие классы или объекты о возникновении каких-либо ситуаций.

Событийно-ориентированное программирование, как правило, применяется в трех случаях:

  • При построении пользовательских интерфейсов (в том числе графических);
  • При создании серверных приложений в случае, если по тем или иным причинам нежелательно порождение обслуживающих процессов;
  • При программировании игр, в которых осуществляется управление множеством объектов.

Для работы события, необходимо подготовить три следующих элемента:

  • Класс, предоставляющий данные для события.
  • Делегат события.
  • Класс, порождающий событие.

В C# событие объявляется ключевым словом event. Каждому члену событию определяется область действия (практически всегда он открытый, поэтому доступен из любого кода), тип делегата, указывающий на прототип вызываемого метода (или методов), и имя (любой допустимый идентификатор).

Для объявления события в классе издателе, используется ключевое слово event

События имеют следующие свойства:

  • Издатель определяет момент вызова события, подписчики определяют предпринятое ответное действие.
  • У события может быть несколько подписчиков. Подписчик может обрабатывать несколько событий от нескольких издателей.
  • События, не имеющие подписчиков, никогда не возникают.
  • Обычно события используются для оповещения о действиях пользователя, таких как нажатия кнопок или выбор меню и их пунктов в графическом пользовательском интерфейсе.
  • Если событие имеет несколько подписчиков, то при его возникновении происходит синхронный вызов обработчиков событий.

Сигнатура обработчика событий должна соответствовать следующим соглашениям:

Метод обработчик события принимает ровно два параметра.

  • Первый параметр называется sender и имеет тип object . Это объект, вызвавший событие.
  • Второй параметр называется — e и имеет тип EventArgs или тип производного класса от EventArgs . Это данные, специфичные для события. Тип возвращаемого значения метода обработчика — void.

Регистрация события происходит с помощью операций += и -= . Эти операции и вызывают на самом деле выполнение методов Add_.Event() и Remove_.Event() . Последний метод отключает обработку события.

Контекстно-зависимое ключевое слово add используется для определения пользовательского метода доступа к событию, вызываемому при подписке клиентского кода к событию. Если указан пользовательский метод доступа add , то необходимо также указать метод доступа remove .

Для чего же нужна такая запутанная конструкция с add и remove ? А все очень просто, в скобках у нас есть возможность создать условие при котором произойдет подписка или отписка к событию. Вот пример:

Таким образом мы создали условие при котором произойдет подписка или отписка от события. Однако для такой конструкции требeется создать свойство myEvent;

  • События это особый тип многоадресных делегатов, которые можно вызвать только из класса или структуры, в которой они объявлены (класс издателя). Если на событие подписаны другие классы или структуры, их методы обработчиков событий будут вызваны, когда класс издателя инициирует событие.
  • События можно пометить как открытые (public), закрытые (private), защищенные (protected), внутренние (internal) или protected internal.
  • Событие можно объявить как статическое событие при помощи ключевого слова static. При этом событие становится доступным для вызова в любое время, даже если экземпляр класса отсутствует.
  • Событие может быть помечено как виртуальное событие при помощи ключевого слова virtual. Это позволяет производным классам переопределять поведение события при
    помощи ключевого слова override.
  • События могут быть абстрактными.
Обновлено: 25.03.2018 — 16:43

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.