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 и за реализиране на колбек функции.