Анонимные методы и лямбда-выражения в 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 опущено, а между списком параметров и блоком кода указывается пара символов «=>». Код получается еще проще и понятнее. И для выполнения простых операций, не нужно создавать полноценные, именованные методы.
Это, конечно же, не вся информация об использовании анонимных методов и лямбда-выражений, но и её уже вполне достаточно, чтобы применять их на практике, по крайней мере, в простых ситуациях.
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.