技术交流 > 心得分享 > 浅谈Lambda表达式和表达式树

浅谈Lambda表达式和表达式树

发了很多理财、旅游的博文,今天发一下技术类的文章,总结一下自己对Lambda表达式和表达式树的理解。


1.首先我们先说下Lambda表达式最通常的用法,就是简化委托:

// 普通委托写法
Func<string, int> returnLength = delegate (string text) { return text.Length; };
// Lambda表达式写法
Func<string, int> returnLength = text => text.Length;


2.另外我们这里顺带谈一下从匿名函数到最简lambda表达式的演化:

Func<string, int> returnLength =

    delegate(string text) { return text.Length; };  //匿名函数
    returnLength = (string text) => { return text.Length; };  //转换成lambda表达式
    returnLength = (string text) => text.Length;  //去掉花括号和return;
    returnLength = (text) => text.Length;  //让编译器自己推断类型;
    returnLength = text => text.Length;  //去掉不必要的括号


3.现在我们说说表达式树:

官方定义:用于表示Lambda表达式逻辑的一种数据结构,表达式树也可以称作表达式目录树,它将代码表示成一个对象树,而不是可执行的代码。


为什么需要把Lambda表达式转化为表达式目录树呢?对于表达式树的提出主要是为后面Linq to SQL 做铺垫,一个Linq to SQL 的查询语句并不是在C#的程序中执行的,而是C#编译器把它转化为SQL 语句,然后再在数据库中执行。


4.Lambda表达式和表达式树之间的转换:


  • Lambda表达式转换为表达式树:

    Expression<Func<int, int>> expression = p => p;  //注意这里的lambda表达式不要用语句体,要用最简形式


  • 表达式树转化为Lambda表达式的委托对象:

    Expression<Func<int, int>> expression = p => p;

    Func<int, int> compiled = expression .Compile();


5.总结:

作为委托和表达式树,两者在IL阶段表示就不一样了。作为委托的IL,在运行期间直接被CLR所执行;而作为表达式树,

是不被CLR所直接执行,而是通过相应的Provider转换为所需要的东西,比如说可以转换为SQL,也可以转换为JAVA。



因笔者水平有限,文章中难免会有不准确或错误的地方,还请大家多多包涵。





2021-09-03 17:47:24
评论
  • 评论加载中...

评论内容: