258.58K
Category: programmingprogramming

Faculty of Mathematics & Informatics

1.

Faculty of Mathematics & Informatics
Department of Advanced
Programming Technologies
Course: Software Engineering
Делегаты.
Action и Func Делегаты.
Yanka Kupala State University of Grodno
Grodno, 2022

2.

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

3.

Делеагты
1. Например, нужен алгоритм сортировки данных, тип которых не известен
заранее (числа, строки, люди, товары).
2. То есть, структура для хранения данных должна позволять хранить
данные разных типов.
Если тип данных неизвестен заранее, как
реализовать сравнение объектов для сортировки?
Можно реализовать конструкцию if/then/else или switch statement и
обрабатывать варианты типов (хорошо известных). Но, такое решение
ограничено использованием известных типов.
Другой способ – реализовать в типе interface (IComparer). Алгоритм
сортировки сможет вызвать метод сравнения объектов этого типа.
(хорошее решение, но много инфраструктурного кода)
Еще один способ – delegate. Передать в метод сортировки через делегат
указатель на метод сравнения объектов, который и будет вызван для
сравнения объектов нужного типа.

4.

Делегаты
Delegate = Тип метода
// Объявление делегата
delegate void Notifier (string sender);
// Объвление переменной типа делегат
Notifier greetings;
// Какой-то метод, сигнатура которого соответствует делегату
void SayHello(string sender)
{
Console.WriteLine("Hello from " + sender);
}
// Назначение метода делегату
greetings = new Notifier(SayHello);
// Вызов метода через делегата
greetings("John"); // вызовет метод SayHello("John")
// Результат работы метода - "Hello from John"

5.

Делегаты
Любой метод, сигнатура которого соответствует делегату,
может быть назначен переменной типа делегат
void SayGoodBye(string sender)
{
Console.WriteLine("Good bye from " + sender);
}
greetings = new Notifier(SayGoodBye);
greetings("John");// SayGoodBye("John") =>"Good bye from John"
Note:
• Переменная-делегат может иметь значение null (ни один метод не назначет).
• Если null и мы пытаемся обратиться к делегату, то возникнет исключение
• Переменная-делегат – это объект (он может быть полем класса, структуры,
параметром метода и т.д.)

6.

Создание объекта-делегата
var dg = new DelegateType(MethodName);
Переменная-делегат хранит ссылку на метод, но не параметры метода
var dg = new Notifier(SayHello);
Вызываемый метод может быть статическим (нужно указать имя
класса перед именем метода)
var dg = new Notifier(MyClass.StaticSayHello);
Метод не может быть abstract, но может быть virtual, override или new.
Сигнатура метода mдолжна соответствовать типу делегата:
Такое же количество параметров
Такие же типы параметров и тип возвращаемого значения
Такие же атрибуты параметров (ref, out, value)

7.

Создание объекта-делегата
Три шага для определения и использования делегата:
•Declaration (объявляем)
•Instantiation (назначаем)
•Invocation (вызываем)
public delegate void Delegate(); // Declaration
class Test
{
public static void Method()
{
Console.WriteLine("Я был вызван делегатом...");
}
public static void Main()
{
// Instantiation
Delegate simpleDelegate = new Delegate(Method);
// Invocation
simpleDelegate();
}
Я был вызыван делегатом...
}

8.

Multicast-делегаты
Переменная-делегат может хранить несколько
значений одновременно
Notifier greetings;
greetings = new Notifier(SayHello);
//first value
greetings += new Notifier(SayGoodBye); //second value
greetings(“John”); // ”Hello from John” “Good bye from John”
greetings -= new Notifier(SayHello);
greetings(“John”); // “Good bye from John”

9.

Action и Func делегаты
Вместо объявления собственных типов-делегатов, во многих
случая можно обойтись использованием предопределенных
типов делегатов (Action и Func)
Action делегат представляет метод, который может принимать от 0 до 16
параметров и не возвращает значение. Это обобщенный делегат, поэтому
необходимо указать типы параметров метода.
Action<string> say = Console.WriteLine;
say(“Hello”); //вызов метода
Func делегат представляет метод, который может принимать от 0 до 16
параметров и возвращать значение. Последним в списке типов параметров
указывается тип возвращаемого значения. Остальные – это типы параметров
метода.
//два параметра типа float, возвращает double
Func<float, float, double> mapping;
Demо (см. Проекты 03_Delegates, 04_LambdaExpressions)

10.

Спасибо за внимание
English     Русский Rules