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

Делегаты

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

Адрес этой области – это точка входа для метода.

Этот адрес используется при вызове метода.

Делегат – это особый объект, который может ссылаться на метод.

Делегату можно присвоить значение «адреса метода».

1

Делегаты

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

Использование делегатов, обеспечивает динамическое связывание для методов

вопрос о выборе конкретной реализации решается во время выполнения программы.

метод1

метод2

ДЕЛЕГАТ

метод3

2

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

Синтаксис объявления типа делегата del_name : delegate return_type del_name (form_param_list);

Синтаксис объявления делегата (объекта) obj_name : del_name obj_name;

Получение объектом-делегатом ссылки на конкретный метод met_name:

obj_name = new del_name(met_name);

Можно объединить:

del_name obj_name = new del_name(met_name);

3

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

Делегат может ссылаться на те и только те методы,

которые совпадают с ним по сигнатуре.

У делегата и метода должны совпадать

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

списки параметров form_param_list.

Вызываемый метод может быть

методом экземпляра,

статическим методом, то есть методом

класса.

4

Пример 1.

Объявление и использование делегата.

using System;

 

delegate string strMet (string s); // объявление делегата

class Test_Del

{

static string repl_Space (string str)

{

Console.WriteLine("замена пробела на _");

return str.Replace (' ', '_');

}

static string del_Space (string str)

{

string temp = "";

Console.WriteLine("удаление пробела");

for (int i = 0; i<str.Length; i++)

if (str[i] != ' ') temp += str[i];

return temp;

}

5

static string rev_Str (string str)

{

Console.WriteLine("перестановка символов строки");

string temp = "";

int i, j;

for (j=0, i=str.Length-1; i>=0; i--, j++)

temp += str[i];

return temp;

}

public static void Main()

{

// создание делегата и получение ссылки на метод

strMet strOp = new strMet (repl_Space);

6

string str;

// вызов метода с помощью делегата

str = strOp ("проверка работы делегата");

Console.WriteLine("новая строка: "+str+"\n");

strOp = new strMet (del_Space);

str = strOp ("проверка работы делегата");

Console.WriteLine("новая строка: "+str+"\n");

strOp = new strMet (rev_Str);

str = strOp ("проверка работы делегата");

Console.WriteLine("новая строка: "+str+"\n");

}

}

Делегатам можно присваивать ссылки на методы экземпляра.

Пример 2. Использование методов экземпляра при работе с делегатами.

using System;

delegate string strMet (string s); // объявление делегата

class Str_Operations

{

public string repl_Space (string str)

{

Console.WriteLine("замена пробела на _");

return str.Replace (' ', '_');

}

8

public string del_Space (string str)

{

string temp = "";

Console.WriteLine("удаление пробела");

for (int i = 0; i<str.Length; i++)

if (str[i] != ' ') temp += str[i];

return temp;

}

public string rev_Str (string str)

{

Console.WriteLine("перестановка символов строки");

string temp = "";

int i, j;

for (j=0, i=str.Length-1; i>=0; i--, j++)

temp += str[i];

9

return temp;

}

}

class Test_Del

{

public static void Main()

{

Str_Operations str_obj = new Str_Operations ();

// создание делегата и получение ссылки на метод

strMet strOp = new strMet (str_obj.repl_Space);

string str;

// вызов метода с помощью делегата

str = strOp ("проверка работы делегата");

10

Console.WriteLine("новая строка: "+str+"\n");

strOp = new strMet (str_obj.del_Space);

str = strOp ("проверка работы делегата");

Console.WriteLine("новая строка: "+str+"\n");

strOp = new strMet (str_obj.rev_Str);

str = strOp ("проверка работы делегата");

Console.WriteLine("новая строка: "+str+"\n");

}

}

11