Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тюмгу / Лекции КБ ИБАС 1 курс 2 семестр / лекция16 Безопасность 2018.pptx
Скачиваний:
14
Добавлен:
08.12.2019
Размер:
128.42 Кб
Скачать

Многоадресные, или групповые, делегаты

В примерах рассматривались делегаты, ссылавшиеся на один метод.

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

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