На головну

Використання події

Розглянемо конкретний приклад класу для демонстрації роботи з подією.

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() Викликаються всі зареєстровані обробники подій. В даному випадку зареєстрований тільки один обробник, але, в більш загальному випадку їх могло б бути і більше.

Більш уважний аналіз даного прикладу дозволяє зробити висновок про те, що по суті справи подія являє собою особливий різновид властивості, яке дозволяє здійснювати доступ не до звичайних полів даних, а до функцій-обробникам цієї події. Але подія робить це не напряму, а за допомогою делегатів, які є зовнішніми повноважними представниками або заступниками цих функцій-обробників. Узагальнюючи сказане можна сміливо стверджувати, що по суті справи подія є посилання на адреси методів реагують на цю подію.



оголошення події | Багатоцільова обробка події.

Події. | Використання подій в компонентах .NET. | Використання подій в компонентах .NET | Класи з великим числом подій | Що об'єднує події, делегати та властивості | Завдання на лабораторну роботу |

© um.co.ua - учбові матеріали та реферати