Sobes.tech
Junior

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

sobes.tech AI

Отговор от AI

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

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

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

Пример за декларация и използване:

// Декларация на делегат
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 и за реализиране на колбек функции.