В C#, функция первого класса (First-Class Function) — это концепция, подразумевающая, что функции можно присваивать переменным, передавать как аргументы другим функциям и возвращать из функций как результат. В C# эту концепцию часто реализуют через [[Делегаты (Delegates)|делегаты (delegates)]] и [[Лямбда-выражение (lambda expression)|лямбда-выражения (lambda expressions)]]. ### Примеры использования функций первого класса в C#: 1. **Присваивание функции переменной:** ```csharp Func<int, int> square = x => x * x; Console.WriteLine(square(5)); // Выведет 25 ``` `Func<int, int>` определяет делегат, который принимает один аргумент типа `int` и возвращает значение типа `int`. Здесь лямбда-выражение `x => x * x` присваивается переменной `square`. 2. **Передача функции как аргумента:** ```csharp public static void ApplyOperation(int[] numbers, Func<int, int> operation) { for (int i = 0; i < numbers.Length; i++) { numbers[i] = operation(numbers[i]); } } ApplyOperation(new int[] { 1, 2, 3 }, x => x * 2); // Массив теперь содержит [2, 4, 6] ``` Здесь функция `ApplyOperation` принимает массив чисел и делегат `Func<int, int>`, который определяет операцию для применения к каждому элементу массива. 3. **Возвращение функции из другой функции:** ```csharp public static Func<int, int> CreateMultiplier(int factor) { return x => x * factor; } var doubler = CreateMultiplier(2); Console.WriteLine(doubler(5)); // Выведет 10 ``` Функция `CreateMultiplier` возвращает лямбда-выражение, которое умножает входное значение на предварительно определённый множитель `factor`. Эти примеры иллюстрируют, как в C# функции можно использовать как значения, что делает их "функциями первого класса". Это предоставляет большую гибкость в проектировании программ, позволяя, например, создавать высокоуровневые абстракции и реализовывать паттерны проектирования, такие как стратегия (Strategy) и команда (Command).