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