Что такое делегат в C#?

«Что такое делегат в C#?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Делегат (delegate) в C# — это типобезопасный указатель на метод. Он определяет сигнатуру метода (возвращаемый тип и параметры), что позволяет передавать методы как аргументы, хранить их в переменных и вызывать позже. Делегаты — основа событийной модели и асинхронных операций в .NET.

Базовое объявление и использование:

// 1. Объявление типа делегата.
delegate int BinaryOperation(int a, int b);

class Program
{
    // 2. Методы, совместимые с сигнатурой делегата.
    static int Add(int x, int y) => x + y;
    static int Multiply(int x, int y) => x * y;

    static void Main()
    {
        // 3. Создание экземпляра делегата.
        BinaryOperation operation = Add;

        // 4. Вызов метода через делегат.
        int result = operation(5, 3); // result = 8
        Console.WriteLine(result);

        // 5. Multicast делегат: делегат может ссылаться на несколько методов.
        operation += Multiply;
        // При вызове будут выполнены все методы в порядке добавления.
        // Но возвращено будет значение только от последнего.
        result = operation(5, 3); // Выполнятся Add(5,3) и Multiply(5,3), result = 15
        Console.WriteLine(result);
    }
}

Встроенные обобщённые делегаты:

На практике чаще используют готовые типы:

  • Action<T> — для методов, которые что-то делают, но не возвращают значение (void).
  • Func<T, TResult> — для методов, возвращающих значение.
// Использование Func вместо объявления своего делегата.
Func<int, int, int> operationFunc = Add;
int sum = operationFunc(10, 20); // 30

// Использование Action.
Action<string> logger = (message) => Console.WriteLine($"Log: {message}");
logger("Hello, Delegate!");

Ключевое применение: Обратные вызовы (callbacks), обработка событий, реализация паттернов (например, Стратегия), LINQ.