Junior
184
questionbank
Что такое делегаты в C# и для чего они используются?
Answer from AI
sobes.tech AI
Делегаты в C# — это типобезопасные указатели на методы. Они инкапсулируют метод, позволяя передавать его как параметр или использовать его в качестве типа переменной.
Используются для:
- Реализация паттерна наблюдатель (Observer): События в C# основаны на делегатах. Издатель уведомляет подписчиков, вызывая делегат.
- Обратные вызовы (Callbacks): Передача метода в качестве аргумента функции, которая вызовет его позже.
- Generic-программирование: Делегаты
ActionиFuncпозволяют создавать обобщенные методы, работающие с различными типами сигнатур. - Параллельное и асинхронное программирование: Методы для выполнения в других потоках или асинхронно часто передаются через делегаты.
- LİNQ: Операторы LINQ активно используют делегаты для определения условий фильтрации, преобразования и т.д.
Пример объявления и использования делегата:
// Объявление делегата с сигнатурой void и одним аргументом типа int
public delegate void MyDelegate(int x);
public class MyClass
{
public void PrintNumber(int num)
{
Console.WriteLine($"Число: {num}");
}
public static void Main(string[] args)
{
// Создание экземпляра делегата, указывающего на метод PrintNumber
MyDelegate del = new MyDelegate(new MyClass().PrintNumber);
// Вызов метода через делегат
del(10);
}
}
Пример с Action (для методов void без возвращаемого значения):
using System;
public class OtherClass
{
public void ExecuteAction(Action action)
{
action(); // Выполняем переданный делегат
}
public static void Main(string[] args)
{
Action myAction = () => Console.WriteLine("Привет из Action!");
new OtherClass().ExecuteAction(myAction);
}
}
Пример с Func (для методов с возвращаемым значением):
using System;
public class ThirdClass
{
public int Calculate(Func<int, int, int> operation, int a, int b)
{
return operation(a, b); // Выполняем переданную операцию и возвращаем результат
}
public static void Main(string[] args)
{
Func<int, int, int> add = (x, y) => x + y;
int result = new ThirdClass().Calculate(add, 5, 3);
Console.WriteLine($"Результат сложения: {result}");
}
}