создан следующим образом.

InRange rangeOK = (low, high, val) => val >= low && val <= high;

После этого одиночное лямбда-выражение может быть выполнено так, как показано ниже.

if(rangeOK(1, 5, 3)) Console.WriteLine(

'Число 3 находится в пределах от 1 до 5.');

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

Блочные лямбда-выражения

Как упоминалось выше, существуют две разновидности лямбда-выражений. Первая из них, одиночное лямбда-выражение, была рассмотрена в предыдущем разделе. Тело такого лямбда-выражения состоит только из одного выражения. Второй разновидностью является блочное лямбда-выражение. Для такого лямбда-выражения характерны расширенные возможности выполнения различных операций, поскольку в его теле допускается указывать несколько операторов. Например, в блочном лямбда-выражении можно использовать циклы и условные операторы if, объявлять переменные и т.д. Создать блочное лямбда-выражение нетрудно. Для этого достаточно заключить тело выражения в фигурные скобки. Помимо возможности использовать несколько операторов, в остальном блочное лямбда-выражение, практически ничем не отличается от только что рассмотренного одиночного лямбда- выражения.

Ниже приведен пример использования блочного лямбда-выражения для вычисления и возврата факториала целого значения.

// Продемонстрировать применение блочного лямбда-выражения, using System;

// Делегат IntOp принимает один аргумент типа int // и возвращает результат типа int. delegate int IntOp(int end);

class StatementLambdaDemo {

static void Main() {

// Блочное лямбда-выражение возвращает факториал // передаваемого ему значения.

IntOp fact = n => {

int г = 1;

for (int i=l; i <= n; i++) r = i * r; return r;

};

Console.WriteLine('Факториал 3 равен ' + fact(3));

Console.WriteLine('Факториал 5 равен ' + fact(5));

}

}

При выполнении этого кода получается следующий результат.

Факториал 3 равен 6 Факториал 5 равен 120

В приведенном выше примере обратите внимание на то, что в теле блочного лямбда- выражения объявляется переменная г, организуется цикл for и используется оператор return. Все эти элементы вполне допустимы в блочном лямбда-выражении. И в этом отношении оно очень похоже на анонимный метод. Следовательно, многие анонимные методы могут быть преобразованы в блочные лямбда-выражения при обновлении унаследованного кода. И еще одно замечание: когда в блочном лямбда-выражении встречается оператор return, он просто обусловливает возврат из лямбда-выражения, но не возврат из охватывающего метода.

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

// Первый пример применения делегатов, переделанный с // целью использовать блочные лямбда-выражения.

using System;

// Объявить тип делегата, delegate string StrMod(string s);

class UseStatementLambdas {

static void Main() {

// Создать делегаты, ссылающиеся на лямбда- выражения,

// выполняющие различные операции с символьными строками.

// Заменить пробелы дефисами.

StrMod ReplaceSpaces = s => {

Console.WriteLine('Замена пробелов дефисами.'); return s.Replace(' '-');

};

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату