В чем разница между Action и Func в C#?

Ответ

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 — когда нужно получить что-то. Вызвал — и жди ответа, как дурак.

Вот и вся магия, никакой ебли с объявлением своих типов делегатов.