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

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

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

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

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

Например:

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

delegate void MessageHandler(string message);

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

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

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!");    // анонимный метод

delegate void MessageHandler(string message);

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

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

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

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

delegate int Operation(int x, int y);

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

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850