Какие базовые делегаты существуют в .NET?

«Какие базовые делегаты существуют в .NET?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В .NET предоставлен набор общих делегатов, которые покрывают большинство сценариев, избавляя от необходимости объявлять собственные. Основные из них:

  1. Action — делегат, который не возвращает значение (void). Может принимать от 0 до 16 входных параметров.

    // Делегат для вывода строки
    Action<string> logAction = message => Console.WriteLine($"[LOG]: {message}");
    logAction("Application started.");
  2. Func — делегат, который возвращает значение. Последний универсальный параметр всегда указывает на тип возвращаемого значения.

    // Делегат для сложения двух чисел
    Func<int, int, int> addFunc = (x, y) => x + y;
    int sum = addFunc(10, 5); // Результат: 15
  3. Predicate<T> — специализированный делегат, возвращающий bool. По сути, это алиас для Func<T, bool>. Часто используется в методах коллекций, например, List.FindAll.

    // Делегат для проверки на чётность
    Predicate<int> isEvenPredicate = number => number % 2 == 0;
    bool result = isEvenPredicate(4); // true
  4. EventHandler и EventHandler<TEventArgs> — стандартные делегаты для реализации событий по соглашениям .NET.

    public event EventHandler<FileLoadedEventArgs> FileLoaded;
  5. Comparison<T> — делегат для сравнения двух объектов одного типа, возвращающий целое число (аналогично Func<T, T, int>). Используется в методах сортировки.

    Comparison<string> lengthComparer = (x, y) => x.Length.CompareTo(y.Length);

Использование этих встроенных делегатов делает код стандартизированным, читаемым и уменьшает количество объявлений пользовательских делегатов.