Lambda 表达式 http://weblogs.asp.net/scottgu/archive/2007/04/08/new-orcas-language-feature-lambda-expressions.aspx是匿名委托的更简单语法,可以在可以使用匿名委托的任何地方使用。然而,事实并非如此。 lambda 表达式可以转换为表达式树,这允许像 LINQ to SQL 一样发挥很多作用。
以下是一个示例LINQ 到对象 http://msdn.microsoft.com/en-us/library/bb397919.aspx使用匿名委托的表达式然后使用 lambda 表达式来显示它们是多么容易理解:
// 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();
Lambda 表达式和匿名委托比编写单独的函数有一个优势:它们实现closures http://en.wikipedia.org/wiki/Closure_(computer_science)这可以让你将本地状态传递给函数而不添加参数 http://www.srtsolutions.com/Looking-Inside-C-Closures函数或创建一次性对象。
表达式树 http://www.interact-sw.co.uk/iangblog/2005/09/30/expressiontrees是 C# 3.0 的一个非常强大的新功能,它允许 API 查看表达式的结构,而不仅仅是获取对可以执行的方法的引用。 API 只需将委托参数放入Expression<T>
参数,编译器将从 lambda 而不是匿名委托生成表达式树:
void Example(Predicate<int> aDelegate);
称为:
Example(x => x > 5);
becomes:
void Example(Expression<Predicate<int>> expressionTree);
后者将通过代表抽象语法树 http://en.wikipedia.org/wiki/Abstract_syntax_tree描述了这个表达式x > 5
。 LINQ to SQL 依靠此行为能够将 C# 表达式转换为服务器端过滤/排序等所需的 SQL 表达式。