КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Пример передачи делегата в качестве параметра функции
Делегат как процедура обратного вызова Пример делегата для оповещения наблюдателей namespace ConsoleApplication1 { delegate void MyDelegate(object o); class Источник { //Делегат-поле класса MyDelegate del; public void Reg(MyDelegate d) //добавление делегатов { del += d; } //событие, возникающее внутри источника – посылка наблюдателям извещения public void Event() { Console.WriteLine("Событие создано!"); if (del!= null) //если в делегате есть функция del(this);//ВЫПОЛНИТЬ метод, “привязанный” к делегату } //удаление делегатов из списка зарегистрированных public void UnReg(MyDelegate d) { del -= d; } } class Наблюдатель1 { //”подходящий” делегту метод public void Do_Event_1(object o) {Console.WriteLine("ВИЖУ, что произошло событие!!!"); } } class Наблюдатель2 { public static void Do_Event_2(object o) { Console.WriteLine("Я тоже ВИЖУ, что произошло событие!!!"); } } class Program {static void Main(string[] args) { Источник A = new Источник(); Наблюдатель1 B = new Наблюдатель1(); Наблюдатель1 C = new Наблюдатель1(); //зарегистрировали делегат (создали его экземпляр), “привязали” к нему метод A.Reg(new MyDelegate(B.Do_Event_1)); A.Reg(new MyDelegate(С.Do_Event_1)); //то же самое, только для СТАТИЧЕСКОГО метода A.Reg(new MyDelegate(Наблюдатель2.Do_Event_2)); A.Event(); //убрали одного наблюдателя для источника A.UnReg(new MyDelegate(B.Do_Event_1)); A.Event(); Console.ReadKey(); } }} Так как делегат является классом, его можно передавать в методы в качестве параметра. Это называется функциональной параметризацией. Функциональная параметризация применяется для создания универсальных методов (например, метод вывода таблицы значений функции) и возможности обеспечения обратного вызова. Обратный вызов (callback) представляет собой вызов функции, передаваемой в другую функцию в качестве параметра. В качестве примера “универсального” метода и демонстрации обратного вызова функции рассмотрим передачу делегата в качестве параметра метода, который выводит на экран таблицу значений функции. В качестве параметров выступают диапазон значений аргумента, шаг его измерений и вид вычисляемой функции (ДЕЛЕГАТ).
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(); } } }
Дата добавления: 2014-01-20; Просмотров: 528; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |