Анонимные методы

Последнее обновление: 31.12.2021

С делегатами тесно связаны анонимные методы. Анонимные методы используются для создания экземпляров делегатов.

Определение анонимных методов

Определение анонимных методов начинается с ключевого слова delegate, после которого идет в скобках список параметров и тело метода в фигурных скобках:

delegate(параметры)
{
    // инструкции
}

Например:

delegate void MessageHandler(string message);
 
MessageHandler handler = delegate (string mes)
{
    Console.WriteLine(mes);
};
 
handler("hello world!");

Анонимный метод не может существовать сам по себе, он используется для инициализации экземпляра делегата, как в данном случае переменная handler представляет анонимный метод. И через эту переменную делегата можно вызвать данный анонимный метод.

Передача анонимного метода как аргумента

Другой пример анонимных методов - передача в качестве аргумента для параметра, который представляет делегат:

delegate void MessageHandler(string message);
 
ShowMessage("hello!", delegate (string mes)
{
    Console.WriteLine(mes);
});
 
static void ShowMessage(string message, MessageHandler handler)
{
    handler(message);
}

Параметры анонимного метода

Если анонимный метод использует параметры, то они должны соответствовать параметрам делегата. Если для анонимного метода не требуется параметров, то скобки с параметрами опускаются. При этом даже если делегат принимает несколько параметров, то в анонимном методе можно вовсе опустить параметры:

delegate void MessageHandler(string message);
 
MessageHandler handler = delegate
{
    Console.WriteLine("анонимный метод");
};
 
handler("hello world!");   // анонимный метод

То есть если анонимный метод содержит параметры, они обязательно должны соответствовать параметрам делегата. Либо анонимный метод вообще может не содержать никаких параметров, тогда он соответствует любому делегату, который имеет тот же тип возвращаемого значения.

При этом параметры анонимного метода не могут быть опущены, если один или несколько параметров определены с модификатором out.

Возвращаемое значение анонимного метода

Также, как и обычные методы, анонимные могут возвращать результат:

delegate int Operation(int x, int y);
 
Operation operation = delegate (int x, int y)
{
    return x + y;
};
 
int result = operation(4, 5);
Console.WriteLine(result);    // 9

Доступ к внешним переменным

При этом анонимный метод имеет доступ ко всем переменным, определенным во внешнем коде:

delegate int Operation(int x, int y);
 
int z = 8;
 
Operation operation = delegate (int x, int y)
{
    return x + y + z;
};
 
int result = operation(4, 5);
Console.WriteLine(result);    // 17

Использование анонимных методов

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