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

Ответ

В .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);

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

Ответ 18+ 🔞

Слушай, ну вот реально, в дотнете всё уже за тебя придумали, блядь! Сидишь ты такой, пишешь свой делегат на 15 параметров, а потом охуеешь — зачем, если можно просто взять готовое, как гречку в пайке.

Вот смотри, основные пацаны на арене:

  1. Action — это типа делегат-похуист, который ничего не возвращает, просто делает своё дело и идёт нахуй. Может от нуля до 16 параметров тащить, как грузовик.

    // Типа логирующая штука
    Action<string> logAction = message => Console.WriteLine($"[LOG]: {message}");
    logAction("Приложение стартануло, ёпта.");
  2. Func — а это уже работяга, который обязан вернуть результат. Последний тип в угловых скобках — это то, что он выплюнет в конце.

    // Сумматор, простой как три рубля
    Func<int, int, int> addFunc = (x, y) => x + y;
    int sum = addFunc(10, 5); // 15, ебать
  3. Predicate<T> — по сути, сторож-бульдог. Возвращает только true или false, как гадалка на вокзале. Фактически это Func<T, bool>, но с паспортом.

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

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

    // Сравниваем строки по длине, например
    Comparison<string> lengthComparer = (x, y) => x.Length.CompareTo(y.Length);

Короче, если использовать эти встроенные делегаты, код становится чище, и не нужно плодить свои сущности, как у дурака фантиков. Стандартизация, блядь, она и в Африке стандартизация.