Событие — это механизм, с помощью которого класс-издатель, отправляющий событие может посылать уведомление другим классам-подписчикам уведомление, об определенном событии.
Лучше, проще и даже нужно это демонстрировать в графическом интерфейсе. Но мы пока разбираем консоль.
Лучше, проще и даже нужно это демонстрировать в графическом интерфейсе. Но мы пока разбираем консоль.
Синтаксис:
модификатор event событийный_делегат объект;
модификатор event событийный_делегат объект;
Алгоритм создания и использования событий:
- 1. Создание событийного делегата.
- 2. Создание класса-издателя. В этом классе определяется событие.
- 2.1 Создание события, как объект делегата.
- 2.2 Создание метода, который вызывает событие.
- 3 Создание класса-подписчика.
- 3.1 Создание обработчика события.
- 4. Создание объекта класса-издателя.
- 5. Создание объекта класса-подписчика.
- 6. Добавление обработчика события в список события.
- 7. Генерирование события.
вариант пользовательского создания события
Main.cs
usingSystem;//объявление событийного делегатаpublicdelegatevoiddlgUserEventHandler();//класс издательclassPublisher {-
//создание событийного объекта -
publiceventdlgUserEventHandler myEvent; -
//создание метода, который вызывает событие -
publicvoidCallEvent() { -
if(myEvent !=null) { -
myEvent(); -
} -
} }//класс подписчикclassSubscriber {-
//создание обработчика события, который уведомляет, что произошло событие -
publicvoidHandler() { -
Console.WriteLine("Произошло некоторое событие"); -
} }classProgram {-
publicstaticintMain() { -
//создание объекта класса издателя -
Publisher P =newPublisher(); -
//создание объекта класса подписчика -
Subscriber S =newSubscriber(); -
//добавляем обработчик события в список события -
P.myEvent +=newdlgUserEventHandler(S.Handler); -
//вызываем событие -
P.CallEvent(); -
Console.ReadKey(); -
return0; -
} }
usingSystem;//объявление событийного делегатаpublicdelegatevoiddlgUserEventHandler();//класс издательclassPublisher {-
//создание событийного объекта -
publiceventdlgUserEventHandler myEvent; -
//создание метода, который вызывает событие -
publicvoidCallEvent() { -
if(myEvent !=null) { -
myEvent(); -
} -
} }//класс подписчикclassSubscriber {-
//создание обработчика события, который уведомляет, что произошло событие -
publicvoidHandler() { -
Console.WriteLine("Произошло некоторое событие"); -
} }classProgram {-
publicstaticintMain() { -
//создание объекта класса издателя -
Publisher P =newPublisher(); -
//создание объекта класса подписчика -
Subscriber S =newSubscriber(); -
//добавляем обработчик события в список события -
P.myEvent +=newdlgUserEventHandler(S.Handler); -
//вызываем событие -
P.CallEvent(); -
Console.ReadKey(); -
return0; -
} }
Произошло некоторое событие
статический обработчик события
Main.cs
usingSystem;//объявление событийного делегатаpublicdelegatevoiddlgUserEventHandler();//класс издательclassPublisher {-
//создание событийного объекта -
publiceventdlgUserEventHandler myEvent; -
//создание метода, который вызывает событие -
publicvoidCallEvent() { -
if(myEvent !=null) { -
myEvent(); -
} -
} }//класс подписчикclassSubscriber {-
//создание статического обработчика события, который уведомляет, что произошло событие -
publicstaticvoidHandler() { -
Console.WriteLine("Произошло некоторое событие"); -
} }classProgram {-
publicstaticintMain() { -
//создание объекта класса издателя -
Publisher P =newPublisher(); -
//добавляем обработчик события в список события -
P.myEvent +=newdlgUserEventHandler(Subscriber.Handler); -
//вызываем событие -
P.CallEvent(); -
Console.ReadKey(); -
return0; -
} }
usingSystem;//объявление событийного делегатаpublicdelegatevoiddlgUserEventHandler();//класс издательclassPublisher {-
//создание событийного объекта -
publiceventdlgUserEventHandler myEvent; -
//создание метода, который вызывает событие -
publicvoidCallEvent() { -
if(myEvent !=null) { -
myEvent(); -
} -
} }//класс подписчикclassSubscriber {-
//создание статического обработчика события, который уведомляет, что произошло событие -
publicstaticvoidHandler() { -
Console.WriteLine("Произошло некоторое событие"); -
} }classProgram {-
publicstaticintMain() { -
//создание объекта класса издателя -
Publisher P =newPublisher(); -
//добавляем обработчик события в список события -
P.myEvent +=newdlgUserEventHandler(Subscriber.Handler); -
//вызываем событие -
P.CallEvent(); -
Console.ReadKey(); -
return0; -
} }
Произошло некоторое событие
обработчик события с параметрами
Как пишут в "литературах", для компонентной совместимости со средой .NET Framework (а ведь язык C# является официальным языком этой среды) обработчик события должен иметь два параметра:
первый — это объект класса-издателя, который генерирует событие, второй — должен иметь тип EventArgs, который ссылается на некую информацию, необходимую обработчику.
Main.cs
usingSystem;//объявление событийного делегатаpublicdelegatevoiddlgUserEventHandler(objectobj, EventArgs e);/*создаем класс, производный от класса EventArgs, который не можетсодержать полей, что бы создать в нем поле*/classMyEventArg : EventArgs {-
//какие-то дополнительные данные для обработчика событий -
publicintcountArg; }//класс издательclassPublisher {-
//создание событийного объекта -
publiceventdlgUserEventHandler myEvent; -
//создание метода, который вызывает событие -
publicvoidCallEvent() { -
if(myEvent !=null) { -
MyEventArg arg =newMyEventArg(); -
myEvent(this, arg); -
} -
} }//класс подписчикclassSubscriber {-
//создание статического обработчика события, который уведомляет, что произошло событие -
publicvoidHandler(objectobj, EventArgs e) { -
Console.WriteLine("Произошло некоторое событие"); -
} }classProgram {-
publicstaticintMain() { -
//создание объекта класса издателя -
Publisher P =newPublisher(); -
//создание объекта класса подписчика -
Subscriber S =newSubscriber(); -
//добавляем обработчик события в список события -
P.myEvent +=newdlgUserEventHandler(S.Handler); -
//вызываем событие -
P.CallEvent(); -
Console.ReadKey(); -
return0; -
} }
usingSystem;//объявление событийного делегатаpublicdelegatevoiddlgUserEventHandler(objectobj, EventArgs e);/*создаем класс, производный от класса EventArgs, который не можетсодержать полей, что бы создать в нем поле*/classMyEventArg : EventArgs {-
//какие-то дополнительные данные для обработчика событий -
publicintcountArg; }//класс издательclassPublisher {-
//создание событийного объекта -
publiceventdlgUserEventHandler myEvent; -
//создание метода, который вызывает событие -
publicvoidCallEvent() { -
if(myEvent !=null) { -
MyEventArg arg =newMyEventArg(); -
myEvent(this, arg); -
} -
} }//класс подписчикclassSubscriber {-
//создание статического обработчика события, который уведомляет, что произошло событие -
publicvoidHandler(objectobj, EventArgs e) { -
Console.WriteLine("Произошло некоторое событие"); -
} }classProgram {-
publicstaticintMain() { -
//создание объекта класса издателя -
Publisher P =newPublisher(); -
//создание объекта класса подписчика -
Subscriber S =newSubscriber(); -
//добавляем обработчик события в список события -
P.myEvent +=newdlgUserEventHandler(S.Handler); -
//вызываем событие -
P.CallEvent(); -
Console.ReadKey(); -
return0; -
} }
Произошло некоторое событие
использование встроенного делегата EventHandler
В связи с тем, что большинство параметров типа EventArgs не используются, в среде .NET Framework существует встроенный тип делегата EventHandler.
Main.cs
usingSystem;//класс издательclassPublisher {-
//создание событийного объекта с помощью встроенного делегата EventHandler -
publiceventEventHandler myEvent; -
//создание метода, который вызывает событие -
publicvoidCallEvent() { -
if(myEvent !=null) { -
//обратите ВНИМАНИЕ на второй аргумент EventArgs.Empty, указывающий, что он пустой -
myEvent(this, EventArgs.Empty); -
} -
} }//класс подписчикclassSubscriber {-
//создание статического обработчика события, который уведомляет, что произошло событие -
publicstaticvoidHandler(objectobj, EventArgs arg) { -
Console.WriteLine("Произошло некоторое событие"); -
} }classProgram {-
publicstaticintMain() { -
//создание объекта класса издателя -
Publisher P =newPublisher(); -
//добавляем обработчик события в список события -
P.myEvent +=newEventHandler(Subscriber.Handler); -
//вызываем событие -
P.CallEvent(); -
Console.ReadKey(); -
return0; -
} }
usingSystem;//класс издательclassPublisher {-
//создание событийного объекта с помощью встроенного делегата EventHandler -
publiceventEventHandler myEvent; -
//создание метода, который вызывает событие -
publicvoidCallEvent() { -
if(myEvent !=null) { -
//обратите ВНИМАНИЕ на второй аргумент EventArgs.Empty, указывающий, что он пустой -
myEvent(this, EventArgs.Empty); -
} -
} }//класс подписчикclassSubscriber {-
//создание статического обработчика события, который уведомляет, что произошло событие -
publicstaticvoidHandler(objectobj, EventArgs arg) { -
Console.WriteLine("Произошло некоторое событие"); -
} }classProgram {-
publicstaticintMain() { -
//создание объекта класса издателя -
Publisher P =newPublisher(); -
//добавляем обработчик события в список события -
P.myEvent +=newEventHandler(Subscriber.Handler); -
//вызываем событие -
P.CallEvent(); -
Console.ReadKey(); -
return0; -
} }
Произошло некоторое событие