• C#3.0 Lamdba表达式与表达式树


    Lamdba表达式与表达式树

       

    Lamdba表达式

    C#2.0中的匿名方法使得创建委托变得简单起来,甚至想不到还有什么方式可以更加的简化,而C#3.0中的lamdba则给了我们答案。

    lamdba的行为实际上和匿名方法是一致的,可以简单粗暴的理解为是匿名方法的进化版本,和匿名方法作用一致,但书写起来更加简单,lamdba表达式有特别的转换規則,表达式并不是委托类型(Delegate),而它可以隐式或显式的转换成委托实例。

    还记得.Net framework给我们内置了两种委托 Func与 Action下面使用它们来进行lamdba的编写

       

    第一个版本,首先定义了一个Func<string,string>类型的委托变量,然后使用lamdba表达式进行实例化委托变量。

    (x) => { To-do…}

    小括号里是参数,这里只有一个string类型的参数所以写一个 x也就是我们string类型的参数,但是在这里我们并不需要指定类型。 然后是=> 最后是 大括号,里面是方法主体。

       

    第二个版本

    在这个版本可就厉害了,可以看到小括号被忽略了,大括号也被忽略了,甚至return 也不存在了,当然这是需要特殊情况下才可以这么去写的,如果参数是两个,那么就要乖乖的把小括号写上了,而后面的主体如果具有逻辑运算,也要把大括号加上。不过现在已经可以看到lamdba表达式是多么惊人了

       

    在一切可以使用匿名方法和委托的地方都可以换成简洁的lamdba表达式

       

       

    表达式树

    表达式树是把代码做为数据,它是一种数据类型,数据就是代码,这可能听起来很绕。

    使用表达式树可以将代码表示成一个对象树,在Linq中大量的被应用。树形结构都知道是什么,表达树式的每一个节点都是一个表达式,在C#中我们使用Experssion类进行创建表达式树。下面创建一个简单的表达式树

       

       

    首先创建第一个节点,然后创建第二个节点。用add类型的表达式将他们组合起来。再打印到屏幕上,会打印4吗?并不会,表达式树只是一种数据结构,并不是可被执行的代码。所以打印出来的是当前的结构

       

    表达式树可以编译成委托,使用LamdbaExperssion,使用它可以把数据结构编译成可执行的代码。

    除了用上面的方式去创建一个代表式,还可以直接使用lamdba表达式去创建表达式树,会更加的简单,不过这是有限制的,一个带有語句块的lamdba是不可以转换成表达式树的

       

    事实上lamdba和表达式树是天生一对,他们共同为linq服务,少了谁对方的存在都失去了色彩。

  • 相关阅读:
    【论文阅读】A practical algorithm for distributed clustering and outlier detection
    第11组 团队Git现场编程实战
    第11组 团队项目-需求分析报告
    团队项目-选题报告
    第二次结对编程作业
    第11组 团队展示
    第一次结对编程作业
    第一次个人编程作业
    第一次博客作业
    (转)script标签到底该放在哪里
  • 原文地址:https://www.cnblogs.com/LiangSW/p/7327633.html
Copyright © 2020-2023  润新知