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