
- •Делегаты
- •Делегаты
- •Объявление делегатов
- •Использование делегатов
- •Пример 1.
- •static string rev_Str (string str)
- •string str;
- •Делегатам можно присваивать ссылки на методы экземпляра.
- •public string del_Space (string str)
- •return temp;
- •Многоадресные, или групповые, делегаты
- •Многоадресные, или групповые делегаты
- •Создание цепочки методов
- •Создание цепочки методов
- •Пример 3. Измененный программный код примера 1 – показывает работу с многоадресным делегатом.
- •static void del_Space (ref string str)
- •public static void Main()
- •//вызов многоадресного делегата strOp (ref str);
- •Преимущества использования делегатов

Многоадресные, или групповые, делегаты
В примерах рассматривались делегаты, ссылавшиеся на один метод.
Однако делегат способен хранить одномоментно несколько адресов областей памяти – несколько ссылок на методы.
12

Многоадресные, или групповые делегаты
Последовательно инициируя эти адреса, делегат может вызывать один за другим соответствующие методы.
Делегаты, хранящие одновременно ссылки на несколько методов, называются многоадресными, или групповыми.
13

Создание цепочки методов
Многоадресные делегаты обязательно должны возвращать результат типа void.
Верно и обратное утверждение –
делегаты, возвращающие результат типа void, могут использоваться как многоадресные.
С такими делегатами можно связать цепочку методов.
14

Создание цепочки методов
Последовательность методов (цепочка) для многоадресного делегата создается по правилу:
сначала надо создать экземпляр делегата;
для добавления метода к цепочке использовать составной оператор присваивания += (или операторы + и =);
для удаления метода из цепочки использовать составной оператор присваивания -= (или операторы – и =).
15

Пример 3. Измененный программный код примера 1 – показывает работу с многоадресным делегатом.
Для возвращения значения измененной строки используется параметр с модификатором ref.
using System;
delegate void strMet (ref string s); // объявление делегата
class Str_Operations
{
static void repl_Space (ref string str)
{
Console.WriteLine("замена пробела на _");
str = str.Replace (' ', '_');
}
16

static void del_Space (ref string str)
{
string temp = "";
Console.WriteLine("удаление пробела");
for (int i = 0; i<str.Length; i++)
if (str[i] != ' ') temp += str[i];
str = temp;
}
static void rev_Str (ref string str)
{
Console.WriteLine("перестановка символов строки");
string temp = "";
int i, j;
for (j=0, i=str.Length-1; i>=0; i--, j++)
temp += str[i];
str = temp;
}
17

public static void Main()
{
//создание ссылочной переменной strMet strOp;
//создание экземпляров делегата strMet replOp = new strMet (repl_Space); strMet delOp = new strMet (del_Space); strMet revOp = new strMet (rev_Str); string str = "проверка работы делегата";
//создание цепочки ссылок
strOp = replOp;
strOp += revOp;
Console.WriteLine("исходная строка: "+str+"\n");
18

//вызов многоадресного делегата strOp (ref str);
Console.WriteLine("новая строка: "+str+"\n");
//создание новой цепочки ссылок
strOp -= replOp;
strOp += delOp;
str = "проверка работы делегата";
Console.WriteLine("исходная строка: "+str+"\n");
// вызов многоадресного делегата
strOp (ref str);
Console.WriteLine("новая строка: "+str+"\n");
}
}
19

20

Преимущества использования делегатов
Основные преимущества использования делегатов в программах на C# связаны
с событийно ориентированным
программированием ,
возможностью выбора вызываемого метода
во время выполнения программы , а не
компиляции.
Делегаты могут применяться в качестве
параметров методов,
можно создавать массивы делегатов.
Важнейший стандартный делегат:
delegate void Action()
21