Несмотря на всю ценность анонимных методов, им на смену пришел более со вершенный подход: лямбда-выражение. Не будет преувеличением сказать, что лямбда- выражение относится к одним из самых важных нововведений в С#, начиная с выпуска исходной версии 1.0 этого языка программирования. Лямбда-выражение основывается на совершенно новом синтаксическом элементе и служит более эффективной альтер нативой анонимному методу. И хотя лямбда-выражения находят применение главным образом в работе с LINQ (подробнее об этом — в главе 19), они часто используются и вместе с делегатами и событиями. Именно об этом применении лямбда-выражений и пойдет речь в данном разделе.
Лямбда-выражение — это другой собой создания анонимной функции. (Первый ее способ, анонимный метод, был рассмотрен в предыдущем разделе.) Следовательно, лямбда-выражение может быть присвоено делегату. А поскольку лямбда-выражение считается более эффективным, чем эквивалентный ему анонимный метод то в боль шинстве случаев рекомендуется отдавать предпочтение именно ему. Лямбда-оператор
Во всех лямбда-выражениях применяется новый лямбда-оператор =>, который раз деляет лямбда-выражение на две части. В левой его части указывается входной пара метр (или несколько параметров), а в правой части — тело лямбда-выражения. Опера тор => иногда описывается такими словами, как "переходит" или "становится".
В C# поддерживаются две разновидности лямбда-выражений в зависимости от тела самого лямбда-выражения. Так, если тело лямбда-выражения состоит из одного вы ражения, то образуется одиночное лямбда-выражение. В этом случае тело выражения не заключается в фигурные скобки. Если же тело лямбда-выражения состоит из блока операторов, заключенных в фигурные скобки, то образуется блочное лямбда-выражение. При этом блочное лямбда-выражение может содержать целый ряд операторов, в том числе циклы, вызовы методов и условные операторы if. Обе разновидности лямбда- выражений рассматриваются далее по отдельности. Одиночные лямбда-выражения
В одиночном лямбда-выражении часть, находящаяся справа от оператора =>, воз действует на параметр (или ряд параметров), указываемый слева. Возвращаемым результатом вычисления такого выражения является результат выполнения лямбда- оператора.
Ниже приведена общая форма одиночного лямбда-выражения, принимающего единственный параметр. параметр => выражение
Если же требуется указать несколько параметров, то используется следующая форма. (список_параметров) => выражение
Таким образом, когда требуется указать два параметра или более, их следует за ключить в скобки. Если же выражение не требует параметров, то следует использовать пустые скобки.
Ниже приведен простой пример одиночного лямбда-выражения. count- => count + 2
В этом выражении count служит параметром, на который воздействует выраже ние count + 2. В итоге значение параметра count увеличивается на 2. А вот еще один пример одиночного лямбда-выражения. n => n % 2 == 0
В данном случае выражение возвращает логическое значение true, если числовое значение параметра n оказывается четным, а иначе — логическое значение false.
Лямбда-выражение применяется в два этапа. Сначала объявляется тип делегата, со вместимый с лямбда-выражением, а затем экземпляр делегата, которому присваивает ся лямбда-выражение. После этого лямбда-выражение вычисляется при обращении к экземпляру делегата. Результатом его вычисления становится возвращаемое значение.