Лямбда-вирази - це простіший синтаксис для анонімних делегатів і може використовуватися скрізь, коли може бути використаний анонімний делегат. Однак навпаки не вірно; лямбда-вирази можуть бути перетворені в дерева виразів, що дозволяє отримати багато магії, як LINQ, для 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 в SQL покладається на цю поведінку, щоб мати змогу перетворити вирази C # у вирази SQL, необхідні для фільтрації / упорядкування / тощо на стороні сервера.
delegate
в C #, я настійно рекомендую читати це , перш ніж читати решту цієї сторінки: stackoverflow.com/questions/2082615 / ...