Анонимные методы и лямбда-выражения в C#

Анонимные методы и лямбда-выражения

Доброго времени суток! В этой статье я расскажу об использовании анонимных методов и лямбда-выражений в связке с делегатами. Если Вы не читали две предыдущий статьи и совсем не знакомы с понятием делегата в C#, то рекомендую их (знакомство с делегатами (Часть 1 и Часть 2)) к прочтению. Для остальных, приведу пример объявления вот такого вот типа делегатов:

//Пример делегата
delegate double DoubleOperation(double anAgr);

Делегаты такого типа хранят ссылки на методы, принимающие один аргумент типа double, и возвращают значение такого же типа. Так вот, при использовании делегатов типа «DoubleOperation«, мы должны создавать методы для каждого частного случая, а случаи бывают довольно простыми, и «подсобной» работы при создании методов может быть даже больше чем полезной. Например, целевой метод может выглядеть примерно так:

//Пример метода для делегатов типа DoubleOperation
static double SomeOperation(double anArg)
{
    return anArg * 2;
}

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

//Создание делегата на основе метода SomeOperation
DoubleOperation tmpDelegate = new DoubleOperation(SomeOperation);

А если нам понадобиться делать какую-то другую операцию, например делить на два. То нужно будет писать такой метод:

//Пример метода для делегатов типа DoubleOperation
static double OtherOperation(double anArg)
{
    return anArg / 2;
}

Как видите, для каждой тривиальной операции нужно создавать отдельный методы. Согласитесь, не очень удобно! Особенно, если такой метод используется только в одном месте программы. В C# есть средства, позволяющие избавить программиста от рутинной работы по созданию отдельных методов «на один раз». Сначала я покажу как это сделать с помощью анонимных методов, а потом — с помощью лямбда-выражений.

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

Для создания экземпляра делегата типа «DoubleOperation» с использованием анонимного метода (т.е. без создания дополнительного именованного метода) можно поступить так:

//Создание делегата с использованием анонимного метода
DoubleOperation tmpDelegate = delegate(double anArg)
{
    return anArg * 2;
};

Как видно, создание объекта-делегата объединено с созданием анонимного метода. В данном случае, мы как бы привязываем анонимный блок кода к объекту-делегату.

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

Если тип делегата подразумевает использование методов без аргументов, то после ключевого слова delegate, можно сразу указывать блок кода в фигурных скобках.

Использование лямбда-выражений

Вместо анонимных методов, при создании делегатов, можно использовать еще и лямбда-выражения, поддержка которых появилась в C# позже. Решить туже задачу, но с применением лямбда-выражения можно так:

//Создание делегата с использованием лямбда-выражения
DoubleOperation tmpDelegate = (double anArg) => { return anArg * 2; };

Как видите, ключевое слово delegate опущено, а между списком параметров и блоком кода указывается пара символов «=>». Код получается еще проще и понятнее. И для выполнения простых операций, не нужно создавать полноценные, именованные методы.

 

Это, конечно же, не вся информация об использовании анонимных методов и лямбда-выражений, но и её уже вполне достаточно, чтобы применять их на практике, по крайней мере, в простых ситуациях.

Добавить комментарий