Junior
Какво са делегатите в C# и за какво се използват?
sobes.tech AI
Отговор от AI
Делегатите в C# са типобезопасни указатели към методи. Те инкапсулират метод, позволявайки да го предавате като параметър или да го използвате като тип променлива.
Използват се за:
- Реализация на патърна наблюдател (Observer): Събитията в C# се базират на делегати. Издателят уведомява абонатите, като извиква делегата.
- Обратни повиквания (Callbacks): Предаване на метод като аргумент към функция, която ще го извика по-късно.
- Обобщено програмиране: Делегатите
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}");
}
}