Книга: C# для профессионалов. Том II
Делегаты
Делегаты
Делегаты являются членами пространства имен, которые инкапсулируют ссылку на метод внутри объекта делегата. Объект делегата может затем передаваться в код, вызывающий указанный метод, не зная во время компиляции, какой метод будет вызван. Красоту, мощь и гибкость делегатов можно увидеть только с помощью примера. Давайте посмотрим, как работают делегаты:
namespace Samples {
using System;
using System.Collections;
public delegate void TestDelegate(string k); // определяет делегата,
// который получает строку в качестве аргумента
public class Sample {
public Sample() {}
public void test(string i) {
Console.WriteLine(i + " has been invoked.");
}
public void text2(string j) {
Console.WriteLine("this is another way to invoke {0}" + j);
}
public static void Main(string[] args) {
Sample sm = new Sample();
TestDelegate aDelegate = new TestDelegate(sm.test);
TestDelegate anotherDelegate = new TestDelegate(sm.test2);
aDelegate("test");
anotherDelegate("test2");
}
}
}
Первый шаг по использованию делегатов состоит в определении делегата. Наш тестовый делегат определяется в строке public delegate void TestDelegate(string k);
. Затем определяется класс с методами, которые имеют сигнатуру, аналогичную делегату. Конечный шаг заключается в создании экземпляра делегата который создается так же, как экземпляр класса и реализуется с помощью оператора new
. Единственное различие состоит в том, что имя целевого метода передается делегату как аргумент. Затем вызывается делегат. В примере вызывается экземпляр aDelegate
с помощью вызова aDelegate("test");
.