Пример делегата для оповещения наблюдателей с помощью событий
namespace ConsoleApplication1
{ public delegate void MyDelegate();
class Источник
{//событие – поле класса
public event MyDelegate My_event;
public void Создать_событие()
{ Console.WriteLine("Событие создано!!!");
//значение события по умолчанию null
if (My_event != null) My_event();
}
}
class Наблюдатель1
{ public void Do_Event_1()
{ Console.WriteLine("ВИЖУ, что произошло событие!!!"); }
}
class Наблюдатель2
{ public static void Do_Event_2()
{ Console.WriteLine("Я тоже ВИЖУ, что произошло событие!!!"); }
}
class Program
{static void Main(string[] args)
{ Источник A = new Источник();
Наблюдатель1 B = new Наблюдатель1();
Наблюдатель1 С = new Наблюдатель1();
//регистрация обработчиков событий
A.My_event += new MyDelegate(B.Do_Event_1);
A.My_event += new MyDelegate(С.Do_Event_1);
A.My_event += new MyDelegate(Наблюдатель2.Do_Event_2);
A.Создать_событие();
A.My_event -= new MyDelegate(B.Do_Event_1);
A.Создать_событие(); Console.ReadKey();
}
}
}
Стандартные делегаты
В библиотеке .NET имеется большое количество стандартных делегатов, предназначенных для реализации обработки событий. Большинство из таких классов оформлено так:
- Имя делегата заканчитвается EventHandler
- Делегат получает 2 параметра – источник события (тип object), аргументы события (тип EventArgs)
Если обработчикам события требуется специфическая информация о событии, то для этого создают класс, производный от стандартного класса EventArgs, и добавляют собственный код. Если же программист не будет использовать в делегате собственный код , то собственный класс не создается, а используется стандартный класс System.EventHandler.