为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
隔江千里 2019-06-26 15:24:08
C#Lambda表达式:我为什么要使用它们?我很快就读了一遍MicrosoftLambda表达式文件。然而,这种例子帮助我更好地理解了:delegate int del(int i);del myDelegate = x => x * x;int j = myDelegate(5); //j = 25尽管如此,我还是不明白为什么这是一种创新。它只是一种在“方法变量”结束时死亡的方法,对吗?为什么我要用这个而不是真正的方法呢?
查看完整描述

3 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

Lambda表达式是匿名委托的一种更简单的语法,可以在任何可以使用匿名委托的地方使用。然而,相反的情况并非如此;lambda表达式可以转换为表达式树,这允许有许多类似LINQtoSQL的魔术。

下面是Linq到对象使用匿名委托的表达式,然后是lambda表达式,以显示它们在外观上有多容易:

// anonymous delegatevar evens = Enumerable
                .Range(1, 100)
                .Where(delegate(int x) { return (x % 2) == 0; })
                .ToList();// lambda expressionvar 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..LinqtoSQL依赖于这种行为,以便能够在服务器端将C#表达式转换为筛选/排序/等所需的SQL表达式。


查看完整回答
反对 回复 2019-06-26
?
HUWWW

TA贡献1874条经验 获得超12个赞

当我想使用另一个控件为某个控件的事件声明一个处理程序时,我发现它们很有用。要正常地执行此操作,您必须将控件的引用存储在类的字段中,以便您可以在与创建它们不同的方法中使用它们。

private ComboBox combo;private Label label;public CreateControls(){
    combo = new ComboBox();
    label = new Label();
    //some initializing code
    combo.SelectedIndexChanged += new EventHandler(combo_SelectedIndexChanged);}void combo_SelectedIndexChanged(object sender, EventArgs e){
    label.Text = combo.SelectedValue;}

由于lambda表达式,您可以这样使用它:

public CreateControls(){
    ComboBox combo = new ComboBox();
    Label label = new Label();
    //some initializing code
    combo.SelectedIndexChanged += (s, e) => {label.Text = combo.SelectedValue;};}

容易多了。


查看完整回答
反对 回复 2019-06-26
  • 3 回答
  • 0 关注
  • 1458 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信