Часть II. Объектно-ориентированное программирование
public event MyHandler2 Event2; // Поле 2. 2-е
// событие. Тип переменной — 2-й делегат
public void FireEvent1(MyEventArgs e) // Обработка
// события
{
if(Event1 != null)
{
Event1(this, e); // Event1 сформировано
// конструктором класса А
}
}
public void FireEvent2(MyEventArgs e)
{
if(Event2 != null)
{ Event2(this,e); }
}
}
// Задание собственного класса, содержащего
// информацию для обработчика события
public class MyEventArgs : EventArgs
{ public string m_id; }
public class Program
{
public static void Main()
{
B b= new B();
A a= new A(b);
MyEventArgs e1=new MyEventArgs(); // Объект,
// содержащий аргументы для 1-го события
MyEventArgs e2=new MyEventArgs(); // Объект,
// содержащий аргументы для 2-го события
e1.m_id ="Аргументы для события 1";
e2.m_id ="Аргументы для события 2";
// Внутри этих методов происходит фактическая
// обработка событий:
b.FireEvent1(e1); // Обработка 1-го события
b.FireEvent2(e2); // Обработка 2-го события
Глава 13. Делегаты и события
301
Console.Read();
}
}
}
Рис. 13.2.
Результат создания и обработки событий
Итак, мы видели, что в классе
В
заданы два события в виде (мы берем
для пояснения одно, первое)
public event MyHandler1 Event1;
Здесь
MyHandler1
— делегат, связываемый с событием
Event1
. Обработ-
ка компилятором ключевого слова
event
приводит к автоматическому
получению методов регистрации и отмены регистрации события в про-
грамме. Если посмотреть программу с помощью функции IL Dasm
(
Tools | IL Dasm
), то можно обнаружить, что компилятор формирует
в этом случае два метода:
Add_.ИмяСобытия()
и
Remove_.ИмяСобытия()
.
То есть один метод добавляет событие, а другой его удаляет при необ-
ходимости. Итак, задание события означает автоматическую отправку
этого события, как говорят, вызывающему коду, т. е. программе. Вызы-
вающий код должен это событие зарегистрировать. Поэтому в методе
обработки события
public void FireEvent1(MyEventArgs e)
в самом начале должна стоять (и на самом деле стоит) проверка
if(Event1 != null)
, означающая вопрос: зарегистрировано ли данное
событие в вызывающем коде? Если событие зарегистрировано, то вы-
полняется обработчик этого события.
Регистрация события происходит с помощью операций
+=
и
-=
. Эти
операции и вызывают на самом деле выполнение методов
Add_.Event1()
и
Remove_.Event1()
. Последний метод отключает обработку события.
В нашем случае в классе
А
, а точнее — в его конструкторе и происходит
фактическая регистрация обоих событий. Сами события объявлены
в классе
В
, а их регистрация происходит при создании объекта класса
А
,
т. к. объект создается конструктором. В конструкторе
А
из первого деле-
гата создается объект
d1
для вызова первого обработчика события, а из
302
Do'stlaringiz bilan baham: |