В 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).