我已经快速阅读了Microsoft Lambda Expression文档。
但是,这种示例有助于我更好地理解:
delegate int del(int i); del myDelegate = x => x * x; int j = myDelegate(5); //j = 25
不过,我仍然不明白为什么这是一项创新。这只是一种在“方法变量”结束时消失的方法,对吗?为什么要使用此方法而不是实际方法?
Lambda表达式是匿名委托的更简单语法,可以在可以使用匿名委托的任何地方使用。但是,事实并非如此。可以将lambda表达式转换为表达式树,这使LINQ to SQL有了很多魔力。
以下是LINQ to Objects表达式的示例,该表达式使用匿名委托然后使用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表达式和匿名委托比编写单独的函数有一个优势:它们实现闭包,可以使您将局部状态传递给函数,而无需向函数添加参数或创建一次性对象。
表达式树是C#3.0的一项非常强大的新功能,它使API可以查看表达式的结构,而不仅仅是获取对可以执行的方法的引用。API只需将委托参数转换为Expression<T>参数,编译器将从lambda而不是匿名委托生成表达式树:
Expression<T>
void Example(Predicate<int> aDelegate);
叫做:
Example(x => x > 5);
变成:
void Example(Expression<Predicate<int>> expressionTree);
后者将传递描述该表达式的抽象语法树的表示形式`x
5`。LINQ to SQL依靠这种行为能够将C#表达式转换为服务器端进行过滤/排序等所需的SQL表达式。