Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
7 семестр / Учебники / Все лекции С# / Все лекции С# / Лекция 20. Делегаты и события.doc
Скачиваний:
156
Добавлен:
24.02.2016
Размер:
150.53 Кб
Скачать

Пример передачи делегата в качестве параметра функции

namespace ConsoleApplication1

{

delegate double MyDelegate(double x);

class Program

{

//в качестве параметров – делегат(вид функции), дапазон значений)

public static void Table(MyDelegate del, double x, double b)

{Console.WriteLine("=========X================Y==================");

while (x <= b)

{

//вызов функции через делегат

Console.WriteLine("|{0,8:0.000}|{1,8:0.000}|", x, del(x));

x += 1;

}

Console.WriteLine("---------------------------------------------");

}

static void Main(string[] args)

{Console.WriteLine("Таблица функции синуса: ");

//вызывается фунция sin(x)

//аналогично написать – new MyDelegate (Math.Sin)

Table(Math.Sin, -2, 2);

Console.WriteLine("Таблица любой функции,принимающей Любое double и возвращающей всегда 1!!!: ");

//АНОНИМНЫЙ МЕТОД!!!

Table(delegate(double x) { return 1;}, 0, 3);

Console.ReadKey();

}

}

}

4.Делегат, как обработчик событий

Событие – это элемент класса, позволяющий классу посылать другим объектам извещения об изменении своего состояния. При этом для этих объектов (наблюдателей) должны обрабатываться эти события. Обработка событий должна быть зарегистрирована в объекте - источнике.

Таким образом, механизм событий реализует паттерн ”наблюдатель”.

Такой паттерн можно еще назвать моделью “публикация-подписка” – один класс (источник, отправитель) сообщения публикует события, которые он может создавать, а другие классы (получатели, наблюдатели) подписываются на получение этих событий.

События тесно связаны с делегатами – с помощью делегатов вызываются обработчики событий.

Общий синтаксис объявления события:

[Cпецификаторы] event тип делегата имя события, где

спецификаторы – new,public,virtual,staticи др, причем событие может быть статическим (для класса) и обычным (для экземпляра класса)

eventключевое слово.

тип делегата – это делегат, методы которого будут обрабатывать данное событие

Пример объявления события:

public delegate void My(object o);//объявление делегата

class A

{ public event My My_Event//объявление события My_Event

}

Алгоритм работы с событиями:

  1. Объявление делегата, задающего сигнатуру методов – обработчиков событий

  2. Объявление события внутри класса (источника)

  3. Объявление и реализация метода, создаваемого событие

  4. Объявление и реализация методов внутри классов (наблюдателей)– обработчиков события (привязанных к делегату). Их сигнатура должна совпадать с делегатом.

  5. Каждый экземпляр класса, желающий получать сообщение о событии должен зарегистрировать в экземпляре источнике метод обработки события.

Пример делегата для оповещения наблюдателей с помощью событий

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();

}

}

}