🗊 Презентация Делегаты

Категория: Образование
Нажмите для полного просмотра!
Делегаты, слайд №1 Делегаты, слайд №2 Делегаты, слайд №3 Делегаты, слайд №4 Делегаты, слайд №5 Делегаты, слайд №6 Делегаты, слайд №7 Делегаты, слайд №8 Делегаты, слайд №9 Делегаты, слайд №10 Делегаты, слайд №11 Делегаты, слайд №12 Делегаты, слайд №13 Делегаты, слайд №14 Делегаты, слайд №15 Делегаты, слайд №16 Делегаты, слайд №17 Делегаты, слайд №18 Делегаты, слайд №19 Делегаты, слайд №20 Делегаты, слайд №21 Делегаты, слайд №22 Делегаты, слайд №23 Делегаты, слайд №24 Делегаты, слайд №25 Делегаты, слайд №26 Делегаты, слайд №27 Делегаты, слайд №28 Делегаты, слайд №29 Делегаты, слайд №30 Делегаты, слайд №31 Делегаты, слайд №32 Делегаты, слайд №33 Делегаты, слайд №34 Делегаты, слайд №35 Делегаты, слайд №36 Делегаты, слайд №37 Делегаты, слайд №38 Делегаты, слайд №39 Делегаты, слайд №40 Делегаты, слайд №41 Делегаты, слайд №42

Содержание

Вы можете ознакомиться и скачать презентацию на тему Делегаты. Доклад-сообщение содержит 42 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1


Делегаты. События
Описание слайда:
Делегаты. События

Слайд 2


Делегаты Делегат — это объект, который может ссылаться на метод - создавая делегат, мы создаем объект, который может содержать ссылку на метод и этот...
Описание слайда:
Делегаты Делегат — это объект, который может ссылаться на метод - создавая делегат, мы создаем объект, который может содержать ссылку на метод и этот метод можно вызвать посредством соответствующей ссылки. Т. о., делегат может вызывать метод, на который он ссылается. Делегат – это так называемый “безопасный указатель на функцию”(делегаты C# = указатель на функцию в С) Делегаты C# могут вызывать более одной функции (при совместном комбинировании двух делегатов результатом будет делегат, который вызывает их обоих). Делегат - это класс отнаследованный от базового класса System.MulticastDelegate. Делегат можно объявлять как в классе, так и просто в пространстве имен.

Слайд 3


во время выполнения программы один и тот же делегат можно использовать для вызова различных методов, просто заменив метод, на который ссылается этот...
Описание слайда:
во время выполнения программы один и тот же делегат можно использовать для вызова различных методов, просто заменив метод, на который ссылается этот делегат (метод, который будет вызван делегатом, определяется не в период компиляции программы, а во время ее работы (достоинство делегата)). во время выполнения программы один и тот же делегат можно использовать для вызова различных методов, просто заменив метод, на который ссылается этот делегат (метод, который будет вызван делегатом, определяется не в период компиляции программы, а во время ее работы (достоинство делегата)). delegate тип_возврата имя(список_параметров); тип_возврата - собой тип значений, возвращаемых методами, которые этот делегат будет вызывать. список_параметров - параметры, принимаемые методами, которые вызываются посредством делегата, Делегат может вызывать только такие методы, у которых тип возвращаемого значения и список параметров (т.е. его сигнатура) совпадают с соответствующими элементами объявления делегата. Делегат может вызывать либо метод экземпляра класса, связанный с объектом, или статический метод, связанный с классом.

Слайд 4


Создание делегата Создание делегата Объявляется сам делегат как тип и сразу же задается прототип функций, которые в будущем могут адресоваться...
Описание слайда:
Создание делегата Создание делегата Объявляется сам делегат как тип и сразу же задается прототип функций, которые в будущем могут адресоваться экземплярами этого типа. Объявляется ссылка типа делегата, которая будет указывать на коллекцию экземпляров делегата. Создаются сами объекты делегата, каждый из которых адресует одну функцию, и комбинируются в коллекцию, на которую указывает объявленная ссылка. Коллекция - собой список адресуемых делегатом функций и поддерживается операциями += и -= или статическими методами Delegate.Combine() и Delegate.Remove() Экземпляр делегата способен вызывать эти методы либо по одному, либо сразу весь список.

Слайд 5


Одноадресная работа делегатов Во время выполнения программы один и тот же делегат можно использовать для вызова разных методов одинаковой сигнатуры...
Описание слайда:
Одноадресная работа делегатов Во время выполнения программы один и тот же делегат можно использовать для вызова разных методов одинаковой сигнатуры простой заменой метода, на который ссылается делегат (главное достоинство делегата, что адресуемый им метод определяется не на этапе компиляции, а в период выполнения). Заменяя в делегате адресуемые функции мы обеспечим их полиморфный вызов. Область видимости делегата можно регулировать точно так же, как и область видимости любого другого типа в приложении.

Слайд 6


Делегаты, слайд №6
Описание слайда:

Слайд 7


Многоадресная работа делегатов Многоадресатная передача — это способность создавать список вызовов (или цепочку вызовов) методов, которые должны...
Описание слайда:
Многоадресная работа делегатов Многоадресатная передача — это способность создавать список вызовов (или цепочку вызовов) методов, которые должны автоматически вызываться при вызове делегата. Делегат с многоадресатной передачей имеет одно ограничение: он должен возвращать тип void. Надо создать экземпляр делегата, а затем для добавления методов в эту цепочку использовать оператор "+=". Для удаления метода из цепочки используется оператор " - = " .

Слайд 8


Делегаты, слайд №8
Описание слайда:

Слайд 9


Делегаты являются экземплярами типа System.MulticastDelegate, который в свою очередь наследует абстрактный класс System.Delegate. Делегаты являются...
Описание слайда:
Делегаты являются экземплярами типа System.MulticastDelegate, который в свою очередь наследует абстрактный класс System.Delegate. Делегаты являются экземплярами типа System.MulticastDelegate, который в свою очередь наследует абстрактный класс System.Delegate. Экземпляр типа MulticastDelegate может хранить в себе одну или сразу несколько ссылок на методы. В любом случае мы не можем явно объявлять делегат с помощью типа MulticastDelegate. Это делается с помощью ключевого слова delegate, но неявно порождается объект класса MulticastDelegate. Структура примера через панель Class View.

Слайд 10


Пустые делегаты Делегат существует как объект до тех пор, пока его список с адресуемыми функциями содержит хотя бы одну функцию. Если список делегата...
Описание слайда:
Пустые делегаты Делегат существует как объект до тех пор, пока его список с адресуемыми функциями содержит хотя бы одну функцию. Если список делегата становится пустым, то он превращается в обычную ссылочную переменную с нулевой адресацией. Т.к. мы можем не только пополнять список, но и удалять из него некоторые функции, то необходимо следить за тем, чтобы список делегата не оказался пустым, иначе при попытке вызова такого списка будет выброшено исключение. Если делегат имеет пустой список, т.е. не ссылается ни на одну функцию, то представляющая его ссылка имеет нулевой адрес

Слайд 11


Делегаты, слайд №11
Описание слайда:

Слайд 12


Члены типа MulticastDelegate, унаследованные от Delegate
Описание слайда:
Члены типа MulticastDelegate, унаследованные от Delegate

Слайд 13


Делегаты, слайд №13
Описание слайда:

Слайд 14


Делегаты, слайд №14
Описание слайда:

Слайд 15


// Запуск class Program { static void Main() { // Настройка консоли Console.Title = MyClass.Title; new MyClass(); // Исполняем } }
Описание слайда:
// Запуск class Program { static void Main() { // Настройка консоли Console.Title = MyClass.Title; new MyClass(); // Исполняем } }

Слайд 16


Методы DynamicInvoke() и GetInvocationList() Позволяют вызывать отдельные члены, адресуемые списком объекта-делегата, и задавать требуемые аргументы....
Описание слайда:
Методы DynamicInvoke() и GetInvocationList() Позволяют вызывать отдельные члены, адресуемые списком объекта-делегата, и задавать требуемые аргументы. Если член списка не имеет аргументов, то в качестве параметра метода используется null, иначе - массив параметров адресуемого члена. Объявление ссылки на объект-делегат прописывает только прототип методов, которые корректно может адресовать эта ссылка. Делегат как объект создается при заполнении списка адресуемыми функциями. Но при формировании списка в него добавляются только имена методов. Это приемлемо, если вызываются функции с пустой сигнатурой.

Слайд 17


class ShowPerson { class ShowPerson { // Объявляем функцию с аргументами public static void Handler(string name, int age) {...
Описание слайда:
class ShowPerson { class ShowPerson { // Объявляем функцию с аргументами public static void Handler(string name, int age) { Console.WriteLine("Сотрудник {0}, возраст {1}", name, age); } } // Вызывающая сторона class MyClass { public static string Title = "Вызов методов с параметрами”; // Объявляем делегат как член класса delegate void MyDelegate(string name, int age); public MyClass() { // Создаем и заполняем объект-делегат MyDelegate del = new MyDelegate(ShowPerson.Handler); // Добавляем другие ссылки int count = 3; for (int i = 1; i < count; i++) { del += ShowPerson.Handler; } // Вызываем цепочку методов с одинаковым параметром del("Иванов", 21); } } // Запуск class Program { static void Main() { // Настройка консоли Console.Title = MyClass.Title; new MyClass(); // Исполняем } }

Слайд 18


если с помощью делегата нужно адресовать методы, имеющие разные значения параметров используется если с помощью делегата нужно адресовать методы,...
Описание слайда:
если с помощью делегата нужно адресовать методы, имеющие разные значения параметров используется если с помощью делегата нужно адресовать методы, имеющие разные значения параметров используется public object DynamicInvoke(params object[ ] args) с помощью метода DynamicInvoke() можно решить проблему надежности кода при адресации вызовов методов посредством делегата. Если любой из цепочки метод при традиционном вызове может дать сбой, то в результате система выдаст исключение и прервет вызовы остальных методов списка(исключение можно обработать, но только для списка в целом, если не контролируется индивидуально каждый член списка делегата). Эти проблемы решает метод DynamicInvoke() совместно с GetInvocationList()

Слайд 19


Делегаты, слайд №19
Описание слайда:

Слайд 20


// Запуск class Program { static void Main() { // Настройка консоли Console.Title = MyClass.Title; new MyClass(); // Исполняем } }
Описание слайда:
// Запуск class Program { static void Main() { // Настройка консоли Console.Title = MyClass.Title; new MyClass(); // Исполняем } }

Слайд 21


Перегруженные операторы 'operator ==' и 'operator !=' Эти операторы позволяют подтвердить или опровергнуть абсолютную идентичность списков функций...
Описание слайда:
Перегруженные операторы 'operator ==' и 'operator !=' Эти операторы позволяют подтвердить или опровергнуть абсолютную идентичность списков функций сравниваемых делегатов.

Слайд 22


Делегаты, слайд №22
Описание слайда:

Слайд 23


Методы Combine() и Remove() Это статические методы, способные получать новый делегат как объединение списков двух делегатов одного и того же типа,...
Описание слайда:
Методы Combine() и Remove() Это статические методы, способные получать новый делегат как объединение списков двух делегатов одного и того же типа, или получать новый делегат с усеченным списком при тех же условиях. Методы могут использоваться вместо перегруженных операций '+=' или '-=' при последовательном изменении списка одиночными функциями по синтаксису MyDelegate del; del = new MyDelegate(obj.Handler1); del += new MyDelegate(obj.Handler2); // Или del = new MyDelegate(obj.Handler1); del = (MyDelegate)Delegate.Combine(del, new MyDelegate(obj.Handler2));

Слайд 24


Делегаты, слайд №24
Описание слайда:

Слайд 25


События в C# Рассылка сообщений с помощью делегата Событие — это автоматическое уведомление о выполнении некоторого действия. События работают...
Описание слайда:
События в C# Рассылка сообщений с помощью делегата Событие — это автоматическое уведомление о выполнении некоторого действия. События работают следующим образом: Объект, которому необходима информация о некотором событии, регистрирует обработчик для этого события. Когда ожидаемое событие происходит, вызываются все зарегистрированные обработчики ( обработчики событий представляются делегатами). События — это члены класса, которые объявляются с использованием ключевого слова event. event событийный_делегат объект; событийный_делегат - имя делегата, используемого для поддержки объявляемого события, элемент объект — это имя создаваемого событийного объекта. если список адресатов пуст, то самого объекта-делегата не существует и ссылка на него имеет значение null. Без проверки этого обстоятельства при попытке вызова адресатов пустой ссылкой-делегатом будет сгенерировано стандартное исключение NullReferenceException.

Слайд 26


Делегаты, слайд №26
Описание слайда:

Слайд 27


Превращение делегата в событие Разработчики C# и библиотеки .NET Framework решили объявлять ссылку на объект делегата, когда он используется для...
Описание слайда:
Превращение делегата в событие Разработчики C# и библиотеки .NET Framework решили объявлять ссылку на объект делегата, когда он используется для рассылки сообщений, с ключевым словом event и называть ее событием. Особенность: Событие-делегат является собственностью класса-источника и вызывать его напрямую из класса-приемника как поле сообщений нельзя. Событие должно инициироваться функцией-членом класса, отсылающего сообщение (функция диспетчеризации), в котором оно для этих целей и объявлено. В приемнике сообщения можно только подписаться на событие источника путем прикрепления нужных функций-обработчиков, а далее вызвать функцию диспетчеризации владельца события. Наполнение списка события конкретными адресами функций выполняют объекты-делегаты. Объявление в классе-источнике делегата как события означает только возможность на него подписаться функциям внешнего кода, но не гарантирует, что на него действительно кто-то подпишется в момент возбуждения этого события в классе-источнике. Поэтому функция диспетчеризации вначале проверяет, не пустой ли делегат, и только потом выполняет вызов связанных с ним методов-обработчиков.

Слайд 28


Делегаты, слайд №28
Описание слайда:

Слайд 29


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

Слайд 30


Типичный способ создания событий В соответствии с теорией объектно-ориентированного программирования событие должно передаваться объектом-источником...
Описание слайда:
Типичный способ создания событий В соответствии с теорией объектно-ориентированного программирования событие должно передаваться объектом-источником при возникновении определенных обстоятельств. Другие классы, содержащие в себе объект с общедоступным полем-событием, по отношению к этому событию могут выступать только как клиенты (внешний код). Они могут только подписаться традиционным способом на событие и прослушивать его, а при получении - реагировать кодом прикрепленных к событию своих обработчиков.

Слайд 31


// Образец сообщения определяется делегатом // Образец сообщения определяется делегатом delegate void Message(object sender, string message); //...
Описание слайда:
// Образец сообщения определяется делегатом // Образец сообщения определяется делегатом delegate void Message(object sender, string message); // Класс-источник сообщения class SourceMessage { // Общедоступное поле ссылки на событие public event Message Mail; // Метод диспетчеризации события, объявили виртуальным // и защищенным для возможности замещения в наследниках protected virtual void OnMail(string mess) { // Инициируем рассылку сообщения всем, кто подписался на событие if (Mail != null) // Если не пустой делегат Mail(this, mess); } // Инициируем событие // Объявляем и инициируем внутреннее поле базовым сообщением string message = "Сообщаю, что сработал таймер!!!\n” + "Текущее время "; // Объявляем внутреннее поле для видимости в методах System.Timers.Timer timer; // Конструктор класса-источника сообщения public SourceMessage() { // Создаем и запускаем таймер, который по истечении // заданного времени инициирует рассылку сообщения timer = new System.Timers.Timer(); timer.Interval = 5000d; // Сработает через 5 секунд timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); timer.Start(); } // Запускаем таймер // Инициирование события из внешнего источника void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { DateTime curTime = DateTime.Now; // Извлекаем текущее системное время

Слайд 32


// Дополняем базовое сообщение временем // Дополняем базовое сообщение временем message += curTime.ToString(); OnMail(message); // Вызываем метод...
Описание слайда:
// Дополняем базовое сообщение временем // Дополняем базовое сообщение временем message += curTime.ToString(); OnMail(message); // Вызываем метод диспетчеризации timer.Stop(); // Останавливаем системный таймер } } // Класс-получатель сообщения class MyClass { static public string Title = "Передача сообщения событием (через 5 секунд!)"; public MyClass() { // Создаем объект с событием SourceMessage obj = new SourceMessage(); // Подписываем на событие обработчик, // печатающий полученную информацию, // с помощью объекта-делегата obj.Mail += new Message(obj_Mail); } // Обработчик. Вызывается автоматически при возникновении причины void obj_Mail(object sender, string message) { String str = "Получена информация от класса “ + sender.GetType().Name + ":\n“ + "\"" + message + "\""; Console.WriteLine(str); } } // Запуск class Program { static void Main() { // Настройка консоли Console.Title = MyClass.Title; new MyClass(); } } // Исполняем

Слайд 33


Модель программирования, основанная на событиях, сейчас является наиболее популярной, а для некоторых задач - и единственно возможной. Модель...
Описание слайда:
Модель программирования, основанная на событиях, сейчас является наиболее популярной, а для некоторых задач - и единственно возможной. Модель программирования, основанная на событиях, сейчас является наиболее популярной, а для некоторых задач - и единственно возможной. Она наиболее приспособлена для построения интерактивных приложений, где требуется организовать диалог с пользователем. Когда пользователь не производит никаких действий, приложение находится в состоянии простоя (idle - простой) и требует минимальных ресурсов компьютера.

Слайд 34


Создание событий с контролем адресатов Используя библиотечные классы, содержащие события: Подписываем в клиенте обработчики на уже готовые события...
Описание слайда:
Создание событий с контролем адресатов Используя библиотечные классы, содержащие события: Подписываем в клиенте обработчики на уже готовые события Влияние на событие библиотечного класса: событие объявляется общедоступными и может наследоваться как обычный член класса( Это дает право расширить библиотечный класс, в котором можно выполнить какие-то действия: скрыть событие, объявив его заново с ключевым словом new как закрытое, или переопределить диспетчер события. ) Диспетчер в библиотечных классах обычно объявляется виртуальным и может быть переопределен в производном классе или даже совсем скрыт для следующих потомков его переобъявлением. Для решения этих задач существует другой способ создания события в классе-источнике, который является более гибким и его называют расширенным(этот способ позволяет отслеживать в классе, содержащем событие, те обработчики, которые клиентский код будет присоединять к нему). Создание события расширенным способом : вместо базового поля используется закрытое поле-делегат используются ключевые слова add и remove, методы add и remove автоматически вызываются при добавлении обработчика в список делегата или удаления его из списка.

Слайд 35


Делегаты, слайд №35
Описание слайда:

Слайд 36


Делегаты, слайд №36
Описание слайда:

Слайд 37


Создание событий со списком делегатов В библиотеке .NET Framework для структурированной поддержки событий создан класс EventHandlerList, который...
Описание слайда:
Создание событий со списком делегатов В библиотеке .NET Framework для структурированной поддержки событий создан класс EventHandlerList, который может хранить в себе элементы, выполняющие функцию делегатов с присоединенными к ним обработчиками(эти элементы маркируются ключами типа Object). Каждому ключу соответствует один или несколько одноадресных делегатов, способных хранить вызовы обработчиков одного и того же прототипа. За событием закрепляется определенный ключ и при манипуляции с событием во внешнем коде делегаты, маркированные этим ключом, добавляются в список. Чтобы активизировать событие, достаточно обратиться к списку с закрепленным за событием ключом, все одноадресные делегаты будут извлечены из списка и присоединенные обработчики будут выполнены. Поскольку элементы списка реализуют вызов обработчиков одноадресным способом, то использование списка позволяет прикреплять обработчики не только с пустым возвращаемым значением, но и с возвращаемым значением любого типа(хотя в большинстве случаев это несущественное преимущество, поскольку результат обработки можно вернуть и через аргументы обработчика). Класс EventHandlerList находится в пространстве имен System. ComponentModel.

Слайд 38


Делегаты, слайд №38
Описание слайда:

Слайд 39


Делегаты, слайд №39
Описание слайда:

Слайд 40


Стандартный делегат EventHandler и стандартный аргумент EventArgs Для большинства практических случаев обработчикам событий достаточно двух...
Описание слайда:
Стандартный делегат EventHandler и стандартный аргумент EventArgs Для большинства практических случаев обработчикам событий достаточно двух параметров, первый из которых будет адресовать объект, возбудивший событие, а второй - некоторую дополнительную информацию. Для этих целей существует библиотечный делегат EventHandler. Второй аргумент делегата всегда можно расширить, если мы хотим передать с событием свою специфическую информацию.

Слайд 41


// Расширение библиотечного класса аргументов // Расширение библиотечного класса аргументов class MyEventArgs : EventArgs { private string message;...
Описание слайда:
// Расширение библиотечного класса аргументов // Расширение библиотечного класса аргументов class MyEventArgs : EventArgs { private string message; // Поле для хранения сообщения // Сервис доступа к полю public String Message { get { return message; } set { message = value; } } } // Класс-источник сообщения class SourceEvent { // Тип стандартного делегата объявлен в mscorlib.System так // public delegate void EventHandler(object sender, System.EventArgs e) // Создание события на базе стандартного делегата public event EventHandler Event; // Метод диспетчеризации события protected virtual void OnEvent(EventArgs args) { if (Event != null) Event(this, args); // Вызываем обработчики } // Симулятор срабатывания события Event по внешней причине public void SimulateEvent() { // Создаем толстый объект и формируем передаваемую информацию MyEventArgs args = new MyEventArgs(); args.Message = "'Это сообщение поступило с событием'"; // Вызываем функцию диспетчеризации события. // Функция ожидает тонкий объект, а ей передается толстый объект - это нормально OnEvent(args); } }

Слайд 42


class MyClass {// Получатель сообщения class MyClass {// Получатель сообщения // Конструктор public MyClass() { // Создаем объект, имеющий событие...
Описание слайда:
class MyClass {// Получатель сообщения class MyClass {// Получатель сообщения // Конструктор public MyClass() { // Создаем объект, имеющий событие SourceEvent obj = new SourceEvent(); // Подписываемся на обработчики события obj.Event += new EventHandler(Handler1); obj.Event += new EventHandler(Handler2); // Вызываем симулятор возникновения события obj.SimulateEvent(); } void Handler1(object sender, EventArgs e) { // Хотим извлечь информацию из толстого объекта, // значит нужно повысить полномочия тонкой ссылки MyEventArgs args = (MyEventArgs)e; String message = args.Message; Console.WriteLine("(Handler1) Получена информация:\n" + message); Console.WriteLine(); } void Handler2(object sender, EventArgs e) { Console.WriteLine("(Handler2) Событие из объекта {0}\n" + "Передан объект-аргумент {1}”, sender.GetType().Name, e.GetType().Name); } } // Запуск class Program { static void Main() { // Настройка консоли Console.Title = "Применение делегата EventHandler"; new MyClass(); // Исполняем } }



Теги Делегаты
Похожие презентации
Mypresentation.ru
Загрузить презентацию