Лямбда-выражения представляют собой более простой синтаксис для анонимных делегатов и могут использоваться везде, где может использоваться анонимный делегат. Однако обратное неверно; Лямбда-выражения могут быть преобразованы в деревья выражений, что позволяет использовать магию, такую как LINQ to SQL.
Ниже приведен пример выражения LINQ to Objects , в котором используются анонимные делегаты, а затем лямбда-выражения, чтобы показать, насколько они проще для глаз:
// anonymous delegate
var evens = Enumerable
.Range(1, 100)
.Where(delegate(int x) { return (x % 2) == 0; })
.ToList();
// lambda expression
var evens = Enumerable
.Range(1, 100)
.Where(x => (x % 2) == 0)
.ToList();
Лямбда-выражения и анонимные делегаты имеют преимущество перед написанием отдельной функции: они реализуют замыкания , которые могут позволить передавать локальное состояние функции без добавления параметров в функцию или создание одноразовых объектов.
Деревья выражений - это очень мощная новая функция C # 3.0, которая позволяет API смотреть на структуру выражения, а не просто получать ссылку на метод, который может быть выполнен. API просто должен превратить параметр делегата в параметр Expression<T>
, и компилятор сгенерирует дерево выражений из лямбды-выражения вместо анонимного делегата:
void Example(Predicate<int> aDelegate);
называется как:
Example(x => x > 5);
становится:
void Example(Expression<Predicate<int>> expressionTree);
Последнему будет передано представление абстрактного синтаксического дерева , которое описывает выражение x > 5
. LINQ to SQL полагается на это поведение, чтобы иметь возможность превращать выражения C # в выражения SQL, требуемые для фильтрации / упорядочения / и т. Д. На стороне сервера.