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 и для реализации колбэков.