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