Sobes.tech
Junior
125
questionbank

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

Answer from AI

sobes.tech AI

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

Основные свойства делегатов:

  • Инкапсуляция методов: Делегат хранит информацию о методе, на который он ссылается.
  • Типобезопасность: Делегат может ссылаться только на те методы, сигнатура которых строго соответствует сигнатуре делегата.
  • Многоадресность (Multicast): Делегаты могут ссылаться на несколько методов одновременно. При вызове делегата вызываются все связанные с ним методы в порядке их добавления.

Пример объявления и использования:

// Объявление делегата
public delegate int MyDelegate(int x, int y);

// Метод, который соответствует сигнатуре делегата
public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

// Использование делегата
public class Program
{
    public static void Main(string[] args)
    {
        Calculator calc = new Calculator();

        // Создание экземпляра делегата и связывание с методом Add
        MyDelegate del = new MyDelegate(calc.Add);

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

С появлением .NET Framework 3.5 и LINQ, широкое распространение получили встроенные обобщенные делегаты:

  • Action<T1, ..., Tn>: Делегат, не возвращающий значения (void). Может принимать от 0 до 16 параметров различных типов.
  • Func<T1, ..., Tn, TResult>: Делегат, возвращающий значение типа TResult. Может принимать от 0 до 16 параметров различных типов.
  • Predicate<T>: Делегат, принимающий один параметр типа T и возвращающий булево значение. Используется для проверки условия.

Таблица сравнения встроенных делегатов:

Делегат Возвращаемое значение Параметры Пример использования
Action void 0..16 параметров Выполнение действия без возврата значения
Func<TResult> TResult 0 параметров + возвращаемое значение TResult Вычисление без входных данных
Func<T, TResult> TResult 1 параметр типа T + возвращаемое значение TResult Преобразование значения
Predicate<T> bool 1 параметр типа T Проверка условия

Делегаты широко используются в обработке событий, асинхронных операциях, LINQ и для реализации колбэков.