发了很多理财、旅游的博文,今天发一下技术类的文章,总结一下自己对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;
Func<int, int> compiled = expression .Compile();
5.总结:
作为委托和表达式树,两者在IL阶段表示就不一样了。作为委托的IL,在运行期间直接被CLR所执行;而作为表达式树,
是不被CLR所直接执行,而是通过相应的Provider转换为所需要的东西,比如说可以转换为SQL,也可以转换为JAVA。

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