Что такое делегат Action в C#?

Ответ

Action — это предопределенный обобщенный делегат в пространстве имен System, который представляет метод, не возвращающий значение (void). Он может принимать от 0 до 16 входных параметров.

Основное назначение: передача методов как объектов (коллбэки) для последующего выполнения, часто в сценариях обратных вызовов, событий или LINQ.

Примеры использования:

// Action без параметров
Action greet = () => Console.WriteLine("Hello, World!");
greet();

// Action с одним параметром
Action<string> logError = (message) => Console.WriteLine($"[ERROR] {message}");
logError("File not found");

// Action с несколькими параметрами
Action<string, int> printDetails = (name, age) => 
{
    Console.WriteLine($"Name: {name}");
    Console.WriteLine($"Age: {age}");
};
printDetails("Alice", 30);

// Использование в LINQ для обработки коллекции
List<int> numbers = new List<int> { 1, 2, 3 };
numbers.ForEach(n => Console.WriteLine(n * n)); // ForEach принимает Action<int>

Практическое применение:

  • Коллбэки в асинхронных операциях (например, продолжения в Task).
  • Обработчики событий и реализации паттернов типа Publisher/Subscriber.
  • Параметризация поведения методов (стратегия, команда).

Ключевое отличие от Func<T>: Func<T> всегда возвращает значение типа T, в то время как Action всегда возвращает void.

Ответ 18+ 🔞

Ну, слушай, вот есть у нас в C# такая штука — Action. Представь себе делегат, но такой, который ничего не возвращает, вообще, void, пустота, ништяк. Как будто ты позвал друга помочь переставить диван, он пришёл, пыхтел, пыхтел, и всё — ни "спасибо" не ждёт, ни отчёта. Сделал и пошёл дальше пиво пить.

Зачем это нужно? Ну, например, чтобы ты мог запихнуть какой-нибудь метод в переменную и сказать: "Выполни это вот тогда-то". От нуля до шестнадцати параметров он может в себя принимать, жадный, блядь, как удав.

Смотри, как это выглядит в жизни:

// Вот самый простой — Action без параметров. Как кнопка "Пуск".
Action позватьНаКухню = () => Console.WriteLine("Чайник вскипел, иди жрать!");
позватьНаКухню(); // Выведет наш призыв

// А вот Action с одним параметром. Скажем, ругатель.
Action<string> материтьсяНаКомпилятор = (ошибка) => Console.WriteLine($"Ну что за хуйня, {ошибка}?!");
материтьсяНаКомпилятор("CS1002");

// А можно и несколько параметров запихнуть.
Action<string, int, bool> описатьКоллегу = (имя, стаж, ленивый) =>
{
    Console.WriteLine($"{имя}, стаж {стаж} лет.");
    Console.WriteLine(ленивый ? "Работает, блядь, через жопу." : "Пашет как папа Карло.");
};
описатьКоллегу("Василий", 10, true);

// В LINQ это тоже пригождается. Вот ForEach для списка — он как раз Action и жрёт.
List<int> числа = new List<int> { 1, 2, 3 };
числа.ForEach(x => Console.WriteLine(x * x)); // Выведет квадраты, и всё, привет.

Где это всё применяется? Да везде, епта! Коллбэки в асинхронщине, обработчики событий (типа нажал кнопку — вызвался Action), или когда нужно в метод передать не данные, а целое действие, которое там внутри выполнится.

И главное, не путай с его братаном Func<T>. Func — это такой делегат-торгаш, он всегда что-то тебе возвращает, хоть bool, хоть целый объект. А наш Action — бессеребренник, альтруист, сделал дело и растворился в void. Пиздец как полезно.