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

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

我很快就读了一遍MicrosoftLambda表达式文件。

然而,这种例子帮助我更好地理解了:

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

尽管如此,我还是不明白为什么这是一种创新。它只是一种在“方法变量”结束时死亡的方法,对吗?为什么我要用这个而不是真正的方法呢?


隔江千里
浏览 1459回答 3
3回答

qq_花开花谢_0

Lambda表达式是匿名委托的一种更简单的语法,可以在任何可以使用匿名委托的地方使用。然而,相反的情况并非如此;lambda表达式可以转换为表达式树,这允许有许多类似LINQtoSQL的魔术。下面是Linq到对象使用匿名委托的表达式,然后是lambda表达式,以显示它们在外观上有多容易://&nbsp;anonymous&nbsp;delegatevar&nbsp;evens&nbsp;=&nbsp;Enumerable &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Range(1,&nbsp;100) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Where(delegate(int&nbsp;x)&nbsp;{&nbsp;return&nbsp;(x&nbsp;%&nbsp;2)&nbsp;==&nbsp;0;&nbsp;}) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ToList();//&nbsp;lambda&nbsp;expressionvar&nbsp;evens&nbsp;=&nbsp;Enumerable &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Range(1,&nbsp;100) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Where(x&nbsp;=>&nbsp;(x&nbsp;%&nbsp;2)&nbsp;==&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ToList();Lambda表达式和匿名委托比编写单独的函数更有优势:它们实现闭包可以让你在不添加参数的情况下将局部状态传递给函数函数或创建一次性使用对象。表达树是C#3.0的一个非常强大的新特性,它允许API查看表达式的结构,而不仅仅是获得对可以执行的方法的引用。API只需将委托参数设置为Expression<T>参数,编译器将从lambda而不是匿名委托生成表达式树:void&nbsp;Example(Predicate<int>&nbsp;aDelegate);叫做:Example(x&nbsp;=>&nbsp;x&nbsp;>&nbsp;5);变成:void&nbsp;Example(Expression<Predicate<int>>&nbsp;expressionTree);的表示形式将被传递给后者。抽象语法树描述表达式的x > 5..LinqtoSQL依赖于这种行为,以便能够在服务器端将C#表达式转换为筛选/排序/等所需的SQL表达式。

HUWWW

当我想使用另一个控件为某个控件的事件声明一个处理程序时,我发现它们很有用。要正常地执行此操作,您必须将控件的引用存储在类的字段中,以便您可以在与创建它们不同的方法中使用它们。private&nbsp;ComboBox&nbsp;combo;private&nbsp;Label&nbsp;label;public&nbsp;CreateControls(){ &nbsp;&nbsp;&nbsp;&nbsp;combo&nbsp;=&nbsp;new&nbsp;ComboBox(); &nbsp;&nbsp;&nbsp;&nbsp;label&nbsp;=&nbsp;new&nbsp;Label(); &nbsp;&nbsp;&nbsp;&nbsp;//some&nbsp;initializing&nbsp;code &nbsp;&nbsp;&nbsp;&nbsp;combo.SelectedIndexChanged&nbsp;+=&nbsp;new&nbsp;EventHandler(combo_SelectedIndexChanged);}void&nbsp;combo_SelectedIndexChanged(object&nbsp;sender,&nbsp;EventArgs&nbsp;e){ &nbsp;&nbsp;&nbsp;&nbsp;label.Text&nbsp;=&nbsp;combo.SelectedValue;}由于lambda表达式,您可以这样使用它:public&nbsp;CreateControls(){ &nbsp;&nbsp;&nbsp;&nbsp;ComboBox&nbsp;combo&nbsp;=&nbsp;new&nbsp;ComboBox(); &nbsp;&nbsp;&nbsp;&nbsp;Label&nbsp;label&nbsp;=&nbsp;new&nbsp;Label(); &nbsp;&nbsp;&nbsp;&nbsp;//some&nbsp;initializing&nbsp;code &nbsp;&nbsp;&nbsp;&nbsp;combo.SelectedIndexChanged&nbsp;+=&nbsp;(s,&nbsp;e)&nbsp;=>&nbsp;{label.Text&nbsp;=&nbsp;combo.SelectedValue;};}容易多了。
打开App,查看更多内容
随时随地看视频慕课网APP