Событие — это механизм, с помощью которого класс-издатель,
отправляющий событие может посылать уведомление другим
классам-подписчикам уведомление, об определенном событии.
Лучше, проще и даже нужно это демонстрировать в графическом интерфейсе. Но мы пока разбираем консоль.
Синтаксис:
модификатор event событийный_делегат объект;
Алгоритм создания и использования событий:
- 1. Создание событийного делегата.
- 2. Создание класса-издателя. В этом классе определяется событие.
- 2.1 Создание события, как объект делегата.
- 2.2 Создание метода, который вызывает событие.
- 3 Создание класса-подписчика.
- 3.1 Создание обработчика события.
- 4. Создание объекта класса-издателя.
- 5. Создание объекта класса-подписчика.
- 6. Добавление обработчика события в список события.
- 7. Генерирование события.
Рассмотрим пример реализации события:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
using System; //объявление событийного делегата public delegate void dlgUserEventHandler(); //класс издатель class Publisher { //создание событийного объекта public event dlgUserEventHandler myEvent; //создание метода, который вызывает событие public void CallEvent() { if(myEvent != null) { myEvent(); } } } //класс подписчик class Subscriber { //создание обработчика события, который уведомляет, что произошло событие public void Handler() { Console.WriteLine("Произошло некоторое событие"); } } class Program { public static int Main() { //создание объекта класса издателя Publisher P = new Publisher(); //создание объекта класса подписчика Subscriber S = new Subscriber(); //добавляем обработчик события в список события P.myEvent += new dlgUserEventHandler(S.Handler); //вызываем событие P.CallEvent(); Console.ReadKey(); return 0; } } |
Cтатический обработчик события
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
using System; //объявление событийного делегата public delegate void dlgUserEventHandler(); //класс издатель class Publisher { //создание событийного объекта public event dlgUserEventHandler myEvent; //создание метода, который вызывает событие public void CallEvent() { if(myEvent != null) { myEvent(); } } } //класс подписчик class Subscriber { //создание статического обработчика события, который уведомляет, что произошло событие public static void Handler() { Console.WriteLine("Произошло некоторое событие"); } } class Program { public static int Main() { //создание объекта класса издателя Publisher P = new Publisher(); //добавляем обработчик события в список события P.myEvent += new dlgUserEventHandler(Subscriber.Handler); //вызываем событие P.CallEvent(); Console.ReadKey(); return 0; } } |
Обработчик события с параметрами
В справочных материалах для компонентной совместимости со средой .NET Framework обработчик события должен иметь два параметра: первый — это объект класса-издателя, который генерирует событие, второй — должен иметь тип EventArgs, который ссылается на некую информацию, необходимую обработчику.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
using System; //объявление событийного делегата public delegate void dlgUserEventHandler(object obj, EventArgs e); /*создаем класс, производный от класса EventArgs, который не может содержать полей, что бы создать в нем поле*/ class MyEventArg : EventArgs { //какие-то дополнительные данные для обработчика событий public int countArg; } //класс издатель class Publisher { //создание событийного объекта public event dlgUserEventHandler myEvent; //создание метода, который вызывает событие public void CallEvent() { if(myEvent != null) { MyEventArg arg = new MyEventArg(); myEvent(this, arg); } } } //класс подписчик class Subscriber { //создание статического обработчика события, который уведомляет, что произошло событие public void Handler(object obj, EventArgs e) { Console.WriteLine("Произошло некоторое событие"); } } class Program { public static int Main() { //создание объекта класса издателя Publisher P = new Publisher(); //создание объекта класса подписчика Subscriber S = new Subscriber(); //добавляем обработчик события в список события P.myEvent += new dlgUserEventHandler(S.Handler); //вызываем событие P.CallEvent(); Console.ReadKey(); return 0; } } |
Использование встроенного делегата EventHandler
В связи с тем, что большинство параметров типа EventArgs не используются, в среде .NET Framework существует встроенный тип делегата EventHandler.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
using System; //класс издатель class Publisher { //создание событийного объекта с помощью встроенного делегата EventHandler public event EventHandler myEvent; //создание метода, который вызывает событие public void CallEvent() { if(myEvent != null) { //обратите ВНИМАНИЕ на второй аргумент EventArgs.Empty, указывающий, что он пустой myEvent(this, EventArgs.Empty); } } } //класс подписчик class Subscriber { //создание статического обработчика события, который уведомляет, что произошло событие public static void Handler(object obj, EventArgs arg) { Console.WriteLine("Произошло некоторое событие"); } } class Program { public static int Main() { //создание объекта класса издателя Publisher P = new Publisher(); //добавляем обработчик события в список события P.myEvent += new EventHandler(Subscriber.Handler); //вызываем событие P.CallEvent(); Console.ReadKey(); return 0; } } |