|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Использование событияРассмотрим конкретный пример класса для демонстрации работы с событием. class EventDemo { // Объявление метода, реагирующего на возникновение события (функция-обработчик) static void handler(){ Console.WriteLine("Произошло событие."); } public static void Main() { // Создаем объект, способный генерировать событие MyEvent evt = new MyEvent(); // Добавляем метод handler() в список обработчиков события этого объекта evt.SomeEvent += new MyEventHandler(handler); // Генерируем событие в созданном объекте evt.OnSomeEvent(); } } Следует заметить, что обработчик события может быть описан как обычная или как статическая функция класса объекта приёмника события. При выполнении программа отображает следующие результаты: Произошло событие. Несмотря на простоту, программа содержит все элементы, необходимые для надлежащей обработки события. Рассмотрим их по порядку. Программа начинается с такого объявления делегата, предоставляющего функцию, реагирующую на возникновение события (функцию-обработчик): delegate void MyEventHandler(); Все события активизируются посредством делегата. Следовательно, событийный делегат определяет сигнатуру для события. В данном случае параметры отсутствуют, однако событийные параметры разрешены. Поскольку события обычно предназначены для многоадресной передачи, то они должны возвращать значение типа void. Затем создается класс MyEvent, содержащий событие. При выполнении следующей строки кода, принадлежащей этому классу, объявляется событийный объект SomeEvent: public event MyEventHandler SomeEvent; Обратите внимание на синтаксис. Именно так объявляются события всех типов. Кроме того, внутри класса MyEvent объявляется метод OnSomeEvent (), который в этой программе вызывается, чтобы сигнализировать о том, что произошло событие. Как показано в следующем фрагменте кода, он вызывает обработчик события посредством делегата SomeEvent. if(SomeEvent!= null) SomeEvent(); Следует отметить то обстоятельство, что обработчик события вызывается только в том случае, если делегат SomeEvent не равен значению null. Поскольку другие части программы, чтобы получить уведомлении о событии, должны зарегистрироваться, то можно сделать так, чтобы метод OnSomeEvent () был вызван до регистрации любого обработчика события. Это означает, что никто еще не успел предоставить свою функцию-обработчик для данного события. Поэтому для того, чтобы предотвратить вызов null -объекта (т.е. несуществующего объекта), событийный делегат необходимо проверить и убедиться в том, что он не равен значению null. Внутри класса EventDemo, который демонстрирует работу события, создается метод для обработки события handler (). В этом примере обработчик события просто отображает сообщение на экране монитора, но ясно, что другие обработчики могли бы выполнять и более полезные действия. Как показано в следующем фрагменте кода, в методе Main () создается объект класса MyEvent, способный генерировать событие SomeEvent, а статический метод handler () регистрируется в качестве обработчика этого события. MyEvent evt = new MyEvent(); // Добавляем метод handler() в список события evt.SomeEvent += new MyEventHandler(handler); Обратите внимание на то, что обработчик добавляется в список с использованием составного оператора "+=". Следует отметить, что события поддерживают только операторы "+=" и "-=". В нашем примере метод handler () является статическим, но в общем случае обработчики событий могут быть методами экземпляров классов. Наконец, при выполнении следующей инструкции "происходит" событие, о котором мы так много говорили. //Генерируем событие. evt.OnSomeEvent(); При вызове метода OnSomeEvent () вызываются все зарегистрированные обработчики событий. В данном случае зарегистрирован только один обработчик, но, в более общем случае их могло бы быть и больше. Более внимательный анализ данного примера позволяет сделать заключение о том, что по сути дела событие представляет собой особую разновидность свойства, которое позволяет осуществлять доступ не к обычным полям данных, а к функциям-обработчикам этого события. Но событие делает это не напрямую, а с помощью делегатов, которые являются внешними полномочными представителями или заместителями этих функций-обработчиков. Обобщая сказанное можно смело утверждать, что по сути дела событие представляет собой ссылку на адреса методов реагирующих на это событие. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.) |