Лекция 8. Делегаты и события

8.1 Делегаты

Делегат — это объект, который может ссылаться на метод. Создавая делегат, по сути, создаёте объект, который может содержать ссылку на метод. Более того, этот метод можно вызватьпосредством соответствующей ссылки. Таким образом, делегат может вызывать метод,на который он ссылается.

Ссылка по существупредставляет собой адрес памяти. Следовательно, ссылка на объект — это адрес объекта. Даже несмотря на то, что метод не является объектом, он тоже имеет отношениек физической области памяти, а адрес его точки входа — это адрес, к которому происходит обращение при вызове метода. Этот адрес можно присвоить делегату. Если ужделегат ссылается на метод, этот метод можно вызвать посредством данного делегата.

Во время выполнения программы один и тот же делегатможно использовать для вызова различных методов, просто заменив метод, на который ссылается этот делегат. Таким образом, метод, который будет вызван делегатом,определяется не в период компиляции программы, а во время ее работы. В этом и состоит достоинство делегата.

Делегат объявляется с помощью ключевого слова delegate. Общая форма объявления делегата имеет следующий вид:

delegate тип_возврата имя(список_параметров);

Здесь элемент тип_возврата представляет собой тип значений, возвращаемых методами, которые этот делегат будет вызывать. Имя делегата указывается элементомимя. Параметры, принимаемые методами, которые вызываются посредством делегата,задаются с помощью элемента список_параметров. Делегат может вызывать толькотакие методы, у которых тип возвращаемого значения и список параметров (т.е. егосигнатура) совпадают с соответствующими элементами объявления делегата.

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

 

using System;

// Объявляем делегат.

delegate string strMod(string str);

classDelegateTest {

// Метод заменяет пробелы дефисами

static string replaceSpaces(string a) {

Console.WriteLine("Замена пробелов дефисами.");

return a.Replace(' ', ' - ' ) ;

}

static string removeSpaces(string a) {// Метод удаляет пробелы.

string temp = "";

int i;

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

for(i=0; i < a.Length; i++)

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

return temp;

}

static string reverse(string a) {// Метод реверсирует строку,

string temp = "";

int i, j;

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

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

temp += a[i];

return temp;

}

public static void Main() {

strMod strOp = new strMod(replaceSpaces); // Создание делегата.

string str;

// Вызываем методы посредством делегата.

str = str0p("ЭTO простой тест.");

Console.WriteLine("Результирующая строка: " + str);

Console.WriteLine();

strOp = new strMod(removeSpaces);

str = strOp("Это простой тест.");

Console.WriteLine("Результирующая строка: " + str);

Console.WriteLine();

strOp = new strMod(reverse);

str = strOp("Это простой тест.");

Console.WriteLine("Результирующая строка: " + str);

}}

Результаты выполнения этой программы выглядят так: