Ответ
В .NET предоставлен набор общих делегатов, которые покрывают большинство сценариев, избавляя от необходимости объявлять собственные. Основные из них:
-
Action— делегат, который не возвращает значение (void). Может принимать от 0 до 16 входных параметров.// Делегат для вывода строки Action<string> logAction = message => Console.WriteLine($"[LOG]: {message}"); logAction("Application started."); -
Func— делегат, который возвращает значение. Последний универсальный параметр всегда указывает на тип возвращаемого значения.// Делегат для сложения двух чисел Func<int, int, int> addFunc = (x, y) => x + y; int sum = addFunc(10, 5); // Результат: 15 -
Predicate<T>— специализированный делегат, возвращающийbool. По сути, это алиас дляFunc<T, bool>. Часто используется в методах коллекций, например,List.FindAll.// Делегат для проверки на чётность Predicate<int> isEvenPredicate = number => number % 2 == 0; bool result = isEvenPredicate(4); // true -
EventHandlerиEventHandler<TEventArgs>— стандартные делегаты для реализации событий по соглашениям .NET.public event EventHandler<FileLoadedEventArgs> FileLoaded; -
Comparison<T>— делегат для сравнения двух объектов одного типа, возвращающий целое число (аналогичноFunc<T, T, int>). Используется в методах сортировки.Comparison<string> lengthComparer = (x, y) => x.Length.CompareTo(y.Length);
Использование этих встроенных делегатов делает код стандартизированным, читаемым и уменьшает количество объявлений пользовательских делегатов.
Ответ 18+ 🔞
Слушай, ну вот реально, в дотнете всё уже за тебя придумали, блядь! Сидишь ты такой, пишешь свой делегат на 15 параметров, а потом охуеешь — зачем, если можно просто взять готовое, как гречку в пайке.
Вот смотри, основные пацаны на арене:
-
Action— это типа делегат-похуист, который ничего не возвращает, просто делает своё дело и идёт нахуй. Может от нуля до 16 параметров тащить, как грузовик.// Типа логирующая штука Action<string> logAction = message => Console.WriteLine($"[LOG]: {message}"); logAction("Приложение стартануло, ёпта."); -
Func— а это уже работяга, который обязан вернуть результат. Последний тип в угловых скобках — это то, что он выплюнет в конце.// Сумматор, простой как три рубля Func<int, int, int> addFunc = (x, y) => x + y; int sum = addFunc(10, 5); // 15, ебать -
Predicate<T>— по сути, сторож-бульдог. Возвращает толькоtrueилиfalse, как гадалка на вокзале. Фактически этоFunc<T, bool>, но с паспортом.// Проверка на чётность, ну ты понял Predicate<int> isEvenPredicate = number => number % 2 == 0; bool result = isEvenPredicate(4); // true, чётный пацан -
EventHandlerиEventHandler<TEventArgs>— это уже церемониймейстеры для событий, чтобы всё по канону было, без самодеятельности.public event EventHandler<FileLoadedEventArgs> FileLoaded; // Всё, событие готово -
Comparison<T>— спец по сравнению двух объектов. Возвращает целое число, как судья на ринге. Используется часто в сортировках.// Сравниваем строки по длине, например Comparison<string> lengthComparer = (x, y) => x.Length.CompareTo(y.Length);
Короче, если использовать эти встроенные делегаты, код становится чище, и не нужно плодить свои сущности, как у дурака фантиков. Стандартизация, блядь, она и в Африке стандартизация.