Делегат (delegate) — это тип, представляющий ссылку на метод с определенной сигнатурой (списком параметров и типом возвращаемого значения). Делегаты позволяют передавать методы как параметры, хранить их в переменных и вызывать динамически.
// Объявляем тип делегата
public delegate int MathOperation(int a, int b);
// Методы, совместимые с делегатом
int Add(int x, int y) => x + y;
int Subtract(int x, int y) => x - y;
// Создание экземпляров делегата
MathOperation operation = Add;
int result = operation(5, 3); // 8
operation = Subtract;
result = operation(5, 3); // 2
C# предоставляет готовые шаблоны делегатов:
Action - для методов без возвращаемого значения
Action<string> log = message => Console.WriteLine(message);
log("Hello, Action!");
Func - для методов с возвращаемым значением
Func<int, int, int> multiply = (x, y) => x * y;
int product = multiply(4, 5); // 20
Predicate - для методов, возвращающих bool
Predicate<string> isLong = s => s.Length > 10;
bool longString = isLong("Hello, Predicate!"); // true
Делегаты могут содержать несколько методов в цепочке вызовов:
Action processor = () => Console.Write("A");
processor += () => Console.Write("B");
processor += () => Console.Write("C");
processor(); // Выведет "ABC"
Обратные вызовы (callbacks)
public void LongRunningOperation(Action callback)
{
// Долгая операция...
callback();
}
События (events)
public class Button
{
public event Action Clicked;
public void Click() => Clicked?.Invoke();
}
Стратегии (strategy pattern)
public void ProcessData(int[] data, Func<int, int> transform)
{
for(int i = 0; i < data.Length; i++)
data[i] = transform(data[i]);
}
Критерий | Делегаты | Интерфейсы |
---|---|---|
Привязка | Поздняя (runtime) | Ранняя (compile-time) |
Количество методов | Один метод | Множество методов |
Производительность | Быстрее вызов | Медленнее вызов |
Гибкость | Легко менять поведение | Требует новых классов |
Лямбда-выражения - компактный синтаксис
Func<int, int> square = x => x * x;
Локальные функции (C# 7.0+)
void Process()
{
int Add(int a, int b) => a + b;
var result = Add(2, 2);
}
Делегаты в C# — это мощный механизм для работы с методами как с объектами первого класса. Они обеспечивают гибкость в проектировании архитектуры приложений, особенно при реализации событий, обратных вызовов и стратегий. Современные версии C# расширили возможности делегатов с помощью лямбда-выражений и обобщенных типов делегатов, сделав их еще более удобными в использовании.