Sobes.tech
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}");
    }
}