
- •Делегаты
- •Делегаты
- •Объявление делегатов
- •Использование делегатов
- •Пример 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);
- •Преимущества использования делегатов

Делегаты
При компиляции программы для кода методов выделяется определенная область памяти.
Адрес этой области – это точка входа для метода.
Этот адрес используется при вызове метода.
Делегат – это особый объект, который может ссылаться на метод.
Делегату можно присвоить значение «адреса метода».
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