Lambda expressions - более простой синтаксис для анонимных делегатов и может использоваться везде, где может использоваться анонимный делегат. Однако противоположное утверждение неверно; лямбда-выражения могут быть преобразованы в деревья выражений, что позволяет использовать большую магию, такую как 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();
Лямбда-выражения и анонимные делегаты имеют преимущество перед писать отдельную функцию : они реализуют closures, что может позволить вам pass local state to the function without adding parameters функции или создавать одноразовые объекты.
Expression trees - это очень мощная новая функция C# 3.0, которая позволяет API просматривать структуру выражения вместо того, чтобы просто ссылаться на метод, который может быть выполнен. API просто должен сделать параметр делегата в Expression<T>
параметра и компилятор сгенерирует дерево выражений из лямбда вместо анонимного делегата:
void Example(Predicate<int> aDelegate);
называется как:
Example(x => x > 5);
становится:
void Example(Expression<Predicate<int>> expressionTree);
Последний получит представление abstract syntax tree, которое описывает выражение x > 5
. LINQ to SQL полагается на это поведение, чтобы иметь возможность превращать выражения C# в выражения SQL, необходимые для фильтрации/упорядочения/и т. Д. На стороне сервера. очищены анонимный синтаксис делегат
Как бы найти метод Find() для обработки этого лямбда-выражения? – 2008-10-03 15:16:51
Предикат - это то, что ожидает метод Find. –
2008-10-03 15:19:28
Поскольку мое выражение лямбда соответствует контракту на предикат, метод Find() принимает его. –
2008-10-03 15:21:01