Ответ
Action и Func — это предопределенные обобщенные делегаты в .NET, которые устраняют необходимость вручную объявлять типы делегатов для стандартных сигнатур.
Action представляет метод, который не возвращает значение (void).
Func представляет метод, который возвращает значение.
Ключевые отличия:
| Критерий | Action |
Func |
|---|---|---|
| Возвращаемое значение | Всегда void. |
Всегда имеет возвращаемый тип (последний параметр типа). |
| Параметры типа | Определяют только типы входных параметров (0-16 штук). | Последний параметр типа — тип возвращаемого значения, остальные — типы входных параметров (0-16 штук). |
| Пример сигнатуры | Action<T1, T2> соответствует void Method(T1 arg1, T2 arg2). |
Func<T1, T2, TResult> соответствует TResult Method(T1 arg1, T2 arg2). |
Примеры использования:
// Action - для операций без возврата результата (например, логирование)
Action<string> logMessage = (message) => Console.WriteLine($"Log: {message}");
logMessage("Application started");
// Func - для операций с возвратом результата (например, преобразование)
Func<int, int, int> add = (a, b) => a + b;
int sum = add(5, 3); // sum = 8
// Func без входных параметров
Func<DateTime> getCurrentTime = () => DateTime.Now;
Когда что использовать:
- Используйте
Action, когда вам нужно передать метод для выполнения побочного эффекта. - Используйте
Func, когда вам нужно передать метод для вычисления значения.
Ответ 18+ 🔞
А, ну вот, опять эти твои делегаты, Action и Func! Слушай, да это же просто пиздец как удобно, если разобраться. Раньше-то, блядь, приходилось каждый раз свой делегат объявлять, как будто в каменном веке живём. А теперь — раз, и готово.
Смотри, вот в чём прикол: Action — это когда метод просто делает что-то и нихуя не возвращает. Ну, типа void. Залил лог в консоль, отправил письмо в жопу — и всё, свободен. Func — это когда метод что-то там посчитал, сходил нахуй и принёс тебе результат. Обязательно что-то возвращает, последний тип в угловых скобках — это как раз тип возвращаемого значения.
Короче, запомни разницу, а то опять перепутаешь:
| Признак | Action |
Func |
|---|---|---|
| Что возвращает? | Да нихуя! (void) |
А вот это — да, всегда что-то. |
За что отвечают типы в < >? |
Только за параметры, которые метод принимает (от нуля до 16, блять). | Последний тип — это что метод вернёт. Остальные — что примет. |
| На что похоже? | Action<int, string> это как void Do(int a, string b). |
Func<int, string, bool> это как bool Check(int a, string b). |
Ну и примеры, чтобы совсем доходило, ебать:
// Action — сделал дело, гуляй смело. Например, логирование.
Action<string> вывестиВКонсоль = (текст) => Console.WriteLine($"Пишу: {текст}");
вывестиВКонсоль("Всё пропало, шеф!");
// Func — сходил, принёс. Например, сложение.
Func<int, int, int> сложиЭтиДваЧисла = (x, y) => x + y;
int результат = сложиЭтиДваЧисла(5, 3); // будет 8, надеюсь, ты посчитал?
// Func может быть даже без параметров, но вернуть что-то обязан.
Func<DateTime> которыйЧас = () => DateTime.Now;
Итог, чтобы не ебать мозг:
Action— когда нужно сделать что-то. Вызвал — и похуй.Func— когда нужно получить что-то. Вызвал — и жди ответа, как дурак.
Вот и вся магия, никакой ебли с объявлением своих типов делегатов.