一尘不染

C#Lambda表达式:为什么要使用它们?

c#

我已经快速阅读了Microsoft Lambda Expression文档。

但是,这种示例有助于我更好地理解:

delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25

不过,我仍然不明白为什么这是一项创新。这只是一种在“方法变量”结束时消失的方法,对吗?为什么要使用此方法而不是实际方法?


阅读 490

收藏
2020-05-19

共1个答案

一尘不染

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而不是匿名委托生成表达式树:

void Example(Predicate<int> aDelegate);

叫做:

Example(x => x > 5);

变成:

void Example(Expression<Predicate<int>> expressionTree);

后者将传递描述该表达式的抽象语法树的表示形式`x

5`。LINQ to SQL依靠这种行为能够将C#表达式转换为服务器端进行过滤/排序等所需的SQL表达式。

2020-05-19