《CSharp In Depth》读书笔记(7)——Lambda expressions
Lambda expressions
CSharp从3.0开始支持lambda表达式。
对于Lambda演算而言,CSharp支持的方式从复杂到简单如下所示:
Lambda表达式的应用
Lambda表达式在List的用法最为典型。
Lambda表达式的应用使得对于集合操作变得更加简洁。
**注意:实际上List.Sort()使用的Comparison等函数都是delegate。所以实际上lambda表达式在编译期被转换成了delegate实例。**
Expression trees
CSharp允许在程序中定义表达式。
所有的表达式都从Expression类继承出来,
其中LambdaExpression也是Expression的子类。
因此我们可以在代码中定义LambdaExpression。
下边是一个简单的例子:
同样在上边这个例子中,编译器将Lambda表达式转换成了delegate实例。
当然Lambda表达式不仅可以编译成delegate实例,
也可以编译成Expression Tree。
把Lambda表达式转换为expression tree的意义在于expression tree可以动态的转换成类似于SQL这样的命令式语句,实现LINQ-to-SQL这样的操作。
这类操作的好处在于可以经过编译器检查之后动态的执行SQL语句。
而一般情况下我们只能在“编译器检查”和“动态的在远程执行代码”中二择其一。
小结
- CSharp3的Lambda演算基本上代替了之前版本匿名函数的位置
- Lambda表达式在编译时会被转换成delegate的实例
- Lambda表达式可以转换成expression tree,使得CSharp可以兼具编译器检查和动态执行SQL的能力。