Передача функций как переменных в C#: делегаты, функциональные интерфейсы и лямбда-выражения

В C# функцию можно передать как переменную, используя делегаты, функциональные интерфейсы или лямбда-выражения. Вот несколько методов, которые можно использовать для достижения этой цели:

  1. Делегаты. Делегаты — это типобезопасный способ инкапсуляции метода и передачи его в качестве параметра. Вы можете определить делегата, который соответствует сигнатуре функции, которую вы хотите передать, а затем назначить функцию экземпляру делегата. Например:
delegate void MyFunctionDelegate(int x);

void MyFunction(int x)
{
    // Code here
}

void ProcessFunction(MyFunctionDelegate func)
{
    func(42);
}

// Usage
ProcessFunction(MyFunction);
  1. Функциональные интерфейсы (C# 9 или более поздние версии). В C# 9 представлены функциональные интерфейсы, которые представляют собой интерфейсы с одним абстрактным методом. Вы можете определить интерфейс с желаемой сигнатурой метода, а затем передать лямбда-выражение или группу методов, соответствующую интерфейсу. Например:
interface IMyFunction
{
    void Invoke(int x);
}

void MyFunction(int x)
{
    // Code here
}

void ProcessFunction(IMyFunction func)
{
    func.Invoke(42);
}

// Usage
ProcessFunction(MyFunction);
  1. Лямбда-выражения. Лямбда-выражения позволяют определить анонимную функцию и передать ее непосредственно в качестве параметра. Вы можете использовать делегат Actionили определить собственный делегат с нужной сигнатурой. Например:
void ProcessFunction(Action<int> func)
{
    func(42);
}

// Usage
ProcessFunction(x => {
    // Code here
});