Событие — это механизм, с помощью которого класс-издатель,
отправляющий событие может посылать уведомление другим
классам-подписчикам уведомление, об определенном событии.
Лучше, проще и даже нужно это демонстрировать в графическом интерфейсе. Но мы пока разбираем консоль.
Синтаксис:
модификатор event событийный_делегат объект;
Алгоритм создания и использования событий:
- 1. Создание событийного делегата.
- 2. Создание класса-издателя. В этом классе определяется событие.
- 2.1 Создание события, как объект делегата.
- 2.2 Создание метода, который вызывает событие.
- 3 Создание класса-подписчика.
- 3.1 Создание обработчика события.
- 4. Создание объекта класса-издателя.
- 5. Создание объекта класса-подписчика.
- 6. Добавление обработчика события в список события.
- 7. Генерирование события.
Рассмотрим пример реализации события:
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татический обработчик события
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, который ссылается на некую информацию, необходимую обработчику.
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.
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;
}
}