Напоминание

Делегаты


Автор: Ломова Любовь Андреевна
Должность: преподаватель
Учебное заведение: Филиал ФГБОУ ВО "Мурманский арктический государственный университет"
Населённый пункт: г. Кировск, Мурманская обл.
Наименование материала: Методическая разработка урока по МДК "Прикладное программирование" для специальности 09.02.03
Тема: Делегаты
Раздел: среднее профессиональное





Назад




МДК 01.02 Прикладное

программирование

Тема 2.2. Разработка кода программного

продукта на уровне модуля

Ломова Л.А.

Терминология

Делегат –

особый вид класса, хранящий ссылки на методы.

Делегат –

это тип, который представляет собой ссылки на методы с

определенным списком параметров и возвращаемым типом.

Все

делегаты являются объектами

типа

System.Delegate или

System.MulticastDelegate.

Делегаты

Синтаксис:

[cпецификаторы]

delegate тип_возвращаемого_значения

имя([параметры])

, где

delegate –

ключевое слово;

тип возвращаемого значения

– тот тип, который будет возвращать функция,

на которую ссылается делегат;

параметры

– необязательные параметры,

которые будут присутствовать у

функции, на которую ссылается делегат.

!

Делегат может служить для вызова любого метода с соответствующей

сигнатурой и возвращаемым типом.

Алгоритм работы с делегатом

1. Объявление делегата.

2. Определение метода, «подходящего» для работы с делегатом

3. В основной программе создание экземпляра делегата и связь его с

определённой функцией (методом);

4. Вызов метода через делегат.

Пример #1

Ситуация: находясь в аэропорту, вы вдруг услышали сигнал

пожарной сигнализации (это событие).

Варианты развития событий:

1.

Бежать к ближайшему аварийному выходу.

2.

Если, ДО сигнализации вы услышали объявление о посадке на

свой самолет, то с посадочным талоном быстро направитесь

ко входу в терминал (билеты уже куплены, а вы очень хотите

на море).

3.

Если по громкой связи объявят о том, что вас ищет

родственник/друг, приехавший вас проводить, то сначала вы

пойдете к столу справок, чтобы покинуть зал вместе.

Применение делегатов

для обычной функции без класса

Применение делегатов

Вызов делегата

делегат

переменная =

new делегат

(объект.метод);

объект.метод

это либо статический метод класса,либо метод

экземпляра класса.

Этот метод должен совпадать по числу и типу

параметров с типом делегата,а также по типу возвращаемого

значения.

Примеры:

Использование делегатов:

Делегат для выбора методов делегирования

(программист не знает,

какой метод ему понадобится и задаёт или определяет его во время

выполнения программы);

Делегат

оповещатель наблюдателя

(паттерн «наблюдатель»);

Делегат, как обратный вызов метода

;

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

Делегаты

Делегаты используются для получения возможности определять вызываемый

метод не при компиляции, а

во время выполнения программы (динамически)

,

т.е.

делегат может связыватьсяне с

одним методом,

а с

несколькими

(экземпляры делегата могут содержать несколько ссылок на методы).

Можно подсоединять к одному делегату несколько методов,

каждый из которых при

единственном обращении к делегату будет вызваться по цепочке.

Таким образом,из

программы будет виден лишь один делегат, за которым скрывается несколько методов.

Недостатки механизма вызова функций,

связанных с делегатом

Они связаны со случаем,когда в списке вызова делегата присутствует

более одной функции:

Функции, на которые ссылаются делегаты, могут возвращать значения,

но их значения не получить,т.к. штатная функция вызова возвращает

значение, которая вернула последняя из опрошенных функций.

При обращении к делегату,содержащему в списке вызова несколько

функций,не гарантируется,

что все функции из списка будут вызваны.

Если одна из них сгенерирует исключение,

то работа штатной функции

вызова будет прервана и остальные функции вызваны не будут.

Самостоятельно:

1. Написать код,складывающий между собой два целых числа

(функция). Использовать делегат.

2. Написатьфункцию,

вычисляющую минимум функции на

отрезке [a, b]: F(x) = a*x

2

(a, x – вещественные). Использовать

делегат.

Использование делегата для работы с

несколькими методами

Исходная функция

Что делает эта

функция?

Что делает эта

функция?

Как надо переписать

код, чтобы

использовался делегат?

Как надо переписать

код, чтобы

использовался делегат?

Использование делегата для работы с

несколькими методами

Проверить

работоспособность

кода

Проверить

работоспособность

кода

Перебор всех

функции делегата

Перебор всех

функции делегата

Multicast-делегаты

Многоадресными (Multicast)

называются делегаты, сочетающие в себе

несколько методов одновременно.

Особенности:

вызывается сразу несколько методов;

все методы вызываются по принципу

FIFO (First In First

Out)

«первым вызван – первым сработает»;

операторы + и += используются, чтобы добавить очередной метод к

делегату;

операторы -

и

-= используются, чтобы удалить

лишний,

уже

ненужный метод из списка.

Комментарий к примеру:

Еще один способ вызова делегата – метод

Invoke()

.

Пример: mydel.Invoke(“строка”);

Если делегат принимает параметры, то в метод Invoke

передаются значения для этих параметров.

Если делегат пуст (в его списке вызова нет ссылок ни на один

из методов → делегат равен Null),

то при вызове такого

делегата будетсоздано исключение. Поэтому при вызове

делегата стоит проверять,

не равен ли он null,

либо можно

использовать метод Invoke и оператор условного null.

Пример: mydel

?

.Invoke(“строка”);

Самостоятельно:

3.

Создать функции MyFunc1,

MyFunc2,ничего не возвращающие,

но работающие со строковым параметром. Использовать делегат

для вызова обеих функций.

Дополнение:для проверки работы функций используйте команду

вывода на экран фразы «Вызвана функция № …».

4.

Написать функцию, вычисляющую минимум функции на отрезке

[a, b]:

F1(x) = a*x

2

(a, x – вещественные);

F2(x) = a * sin(x). Использовать делегат для вызова обеих функций.

События

Событие в ООП

— это

сообщение, которое возникает в различных точках

исполняемого

кода

при

выполнении

определённых

условий

(по

сути,

сообщает об

изменении

состояния некоторого объекта).

Предназначены для того,

чтобы иметь

возможность предусмотреть

реакцию программного обеспечения.

В C# делегаты образуют основные строительные блоки для событий.

События

Событие

– это особый тип делегата,

который облегчаетсобытийно-

ориентированное программирование.События — это члены класса,

которые нельзя вызывать вне класса независимо от спецификатора

доступа.

Например, событие, объявленное как public,

позволило бы другим

классам использовать += и -= для этого события,

но запуск события (то

есть вызов делегата) разрешен только в классе, содержащем событие.

В чем схожесть

событий и

делегатов? Как

выбрать подходящий

механизм?

Домашнее задание

1.

Что такое ковариантность и контравариантность в C#?

Приведите примеры.

2.

Что такое лямбда-выражение? Приведите примеры.

Благодарю за внимание!



В раздел образования