пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

События. Обработка событий в C#. Связывание событий с обработчиками через делегат.

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

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

[модификатор-уровня-доступа] event имя-класса-делегата имя-события

Класс, решивший иметь события, должен уметь, по крайней мере, три вещи:

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

Отметим, что, зажигая событие, класс посылает сообщение получателям события - объектам некоторых других классов. Будем называть класс, зажигающий событие, классом - отправителем сообщения (sender). Класс, чьи объекты получают сообщения, будем называть классом - получателем сообщения (receiver). Класс-отправитель сообщения, в принципе, не знает своих получателей. Он отправляет сообщение в межмодульное пространство.

В принципе, одно и то же сообщение может быть получено и по-разному обработано произвольным числом объектов разных классов.

Обработчик события - это обычная процедура с аргументами. Понятно, что сообщение, посылаемое при зажигании события, является аналогом вызова процедуры. Поскольку сигнатура посылаемого сообщения должна соответствовать сигнатуре принимаемого сообщения, то объявление события синтаксически должно задавать сигнатуру процедуры.

Делегаты и события

В C# каждое событие определяется делегатом, описывающим сигнатуру сообщения. Объявление события - это двухэтапный процесс:

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

Если делегат определен, то в классе Sender, создающем события, достаточно объявить событие как экземпляр соответствующего делегата. Это делается точно так же, как и при объявлении функциональных экземпляров делегата.

Исключением является добавление служебного слова event. Формальный синтаксис объявления таков:

[атрибуты] [модификаторы] event [тип, заданный делегатом] [имя события]

Есть еще одна форма объявления. Чаще всего, атрибуты не задаются, а модификатором является модификатор доступа - public. С


14.01.2019; 12:25
хиты: 112
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь