конспект лекций, вопросы к экзамену

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

Например, события возникают при движении мыши, щелчке или изменении размеров окна. Событие обеспечивают механизм взаимных уведомлений объектов. Так, кнопка может предоставлять событие, уведомляющее другие объекты о том, что ее щелкнули. CTS также определяет правила для видимости типов и доступа к их членам. Например, если тип помечен как открытый (public) (в С# — public), он экспортируется, видим и доступен любой сборке. С другой стороны, если тип помечен как сборочный (assembly) (в С# — internal), он видим и доступен только коду той сборки, в которой реализован. Таким образом, CTS определяет правила, по которым сборки формируют границы видимости типа, a CLR реализует эти правила.

Независимо от того, видим ли тип вызывающему коду, этот тип контролирует доступ к своим членам со стороны вызывающего кода.

Если в типе определен член-событие, то этот тип (или его экземпляр) может уведомлять другие объекты о некоторых особых событиях. Скажем, класс Button («кнопка») определяет событие Click («щелчок»). В приложении могут быть объекты, которые должны получать уведомление о щелчке объекта Button, а получив такое  уведомление, — исполнять некоторые действия. События — это члены типа, обеспечивающие такого рода взаимодействие. Тип, в котором определены события, как минимум поддерживает: • регистрацию объектов, заинтересованных в получении уведомления о событии; • отмену регистрации объектов, получающих уведомления о событии; • возможность управления набором зарегистрированных объектов и их уведомления о некоторых особенных событиях.

Модель событий CLR основана на делегатах. Делегаты позволяют обращаться к методам обратного вызова, не нарушая безопасности типов.

Для обработки сообщений мыши в С# предусмотрен ряд событий, которые посылаются программе при совершении определенных действий. События посылаются, если вы передвинете курсор мыши, щелкните какой-нибудь кнопкой либо проделаете все эти действия одновременно. Для обработки сообщений от мыши у формы существуют следующие события: MouseDown — обработка нажатия какой-либо из кнопок вниз;MouseEnter — вызывается при попадании указателя мыши в область формы; MouseHover — вызывается при зависании указателя мыши в окне формы;MouseLeave — вызывается при покидании курсора мыши области формы;MouseMove — вызывается при движении мыши в области формы; MouseUp — вызывается при отпускании кнопки мыши.

Практически во всех Windows-приложениях требуется асинхронная обработка событий. Некоторые из этих событий связаны с самой ОС, например, когда Windows посылает сообщения в очередь сообщений приложения при том или ином взаимодействии пользователя с приложением. Другие больше связаны с предметной областью, например, когда нужно распечатать счет при обновлении заказа.

Работа с событиями в С# соответствует модели "издатель — подписчик", где класс публикует событие, которое он может инициировать, и любые классы могут подписаться на это событие. При инициации события исполняющая среда следит за тем, чтобы уведомить всех подписчиков о возникновении события.

Метод, вызываемый при возникновении события, определяется делегатом. Однако нужно помнить об ограничениях, которые налагаются на делегаты, используемые для этих целей. Во-первых, нужно чтобы такой делегат принимал два аргумента. Во-вторых, эти аргументы всегда должны представлять два объекта: тот, что инициировал событие (издатель), и информационный объект события, который должен быть производным от класса EventArgs .NET Framework

Делегаты в C# позволяют применять методы одного класса к объектам другого класса, который может эти методы вызвать. Делегаты C# являются в .NET Framework реализацией в качестве производного класса от System.Delegate. Использование делегатов можно описать четырьмя шагами.

1. Определение объекта делегата с сигнатурой, точно соответствующей сигнатуре метода, который пытаемся связать.

2. Определение метода с сигнатурой делегата, определенного на первом шаге

3. Создание объекта делегата и связывание их с методами

4. Вызов связанного метода с помощью объекта делегата

Слово делегат (delegate) используется в C# для обозначения хорошо известного понятия. Делегат задает определение функционального типа (класса) данных. Экземплярами класса являются функции. Описание делегата в языке C# представляет собой описание еще одного частного случая класса. Каждый делегат описывает множество функций с заданной сигнатурой. Каждая функция (метод), сигнатура которого совпадает с сигнатурой делегата, может рассматриваться как экземпляр класса, заданного делегатом. Синтаксис объявления делегата имеет следующий вид:

[<спецификатор доступа>] delegate <тип результата > <имя класса> (<список аргументов>);

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

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

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

event делегат_события имя_события;

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

События основаны на делегатах и предоставляют им механизм публикации/подписки. В каркасе .NET события присутствуют повсюду. В приложениях Windows класс Button поддерживает событие Click. Этот тип события является делегатом. Метод-обработчик, вызываемый с событием Click, должен быть определен с параметрами, заданными в типе делегата.

Как и делегаты, события поддерживают групповую адресацию. Это дает возможность нескольким объектам реагировать на уведомление о событии.

30.12.2019; 08:00
просмотров: 83