标签:linq
一.简介
一个Lambda Expression(译为Lambda式) 就是一个包含若干表达式和语句的匿名函数。可以被用作创建委托对象或表达式树类型。Lambda 表达式对于编写 LINQ 查询表达式特别有用。
所有的Lambda式都使用操作符“=>“,表示“goes to (转变为)”。操作符左边部分是输入参数表,右边部分是表达式或语句块。接下来就看一下它的作用及用法。
二.何时用?
在Framework 2.0 以前,声明委托的唯一方法是通过方法命名,从Framework 2.0 起,系统开始支持匿名方法。
通过匿名方法,可以直接把一段代码绑定给事件,因此减少了实例化委托所需的编码系统开销。
而在 Framework 3.0 开始,Lambda 表达式开始逐渐取代了匿名方法,作为编写内联代码的首选方式。总体来说,Lambda 表达式的作用是为了使用更简单的方式来编写匿名方法,彻底简化委托的使用方式。
那么接下来就通过几个实例来理解一下吧!
用匿名方法
static void Main(string[] args)
{
Button btn = new Button();
btn.Click+=delegate(objectobj,EventArgs e){
MessageBox.Show("HelloWorld !");
};
}
使用Lambda表达式
<span style="font-size:18px;">static void Main(string[] args) { Button btn = new Button(); btn.Click+=(object obj,EventArgs e)=>{ MessageBox.Show("Hello World !"); }; } </span>
通过以上对匿名函数和Lambda表达式的实战是否发现Lambda表达式其实就是一个匿名函数,但是它比匿名函数更容易让人理解,更简单,这也是它近年来发展迅速的原因吧!接下来就针对Lambda表达式来讲解一下。
三.表达式用法
1.表达式Lambda
由一个计算表达式组成的一个Lambda式称之为表达式Lambda。表达式Lambda常被用于构造表达式树。一个表达式Lambda返回计算表达式运算的结果。
基本结构:
(input parameters)=> expression
如果只有一个输入参数时,括号可以省略。如果具有一个以上的输入参数,必需加上括号。
(x) => x * x 等于 x => x * x
(x, y) => x ==y
可以显式指定输入参数的类型
(int x, string s)=> s.Length > x
也可以没有任何输入参数
() =>SomeMethod1()
上面这段代码在Lambda式中调用了一个方法。需要注意的是,如果在创建会被其他方使用的表达式树的时候,不宜在Lambda式中执行方法调用。比如:在SQL Server内执行。
一般来说,让一个方法在原先设计的上下文环境以外执行没有意义,也不能真正工作。
语句Lambda和表达式Lambda非常相似,只是语句被包含在大括号内:
(input parameters)=> {statement;}
大括号中的语句可以是任意多条,也可以写成多行(定义一个Lambda式也就是在定义一个匿名方法):
TestDelegate myDel= n => { string s = n + " " + "World";
当然语句Lambda跟匿名方法一样,无法用于创建表达式树。
当编写一个Lambda式的时候,我们通常不需要明确指定输入参数的类型。因为编译器会根据Lambda体的实现,以及委托的定义来猜测类型。
举例:如果要从一个List<int>中删除小于100的元素
lst.RemoveAll(i=> i < 100);
1·
2·
3·
注意:由于目前在common type system中还没有一个“Lambda式类型”的类型。如果在有些场合提到“Lambda式的类型”,那通常表示委托的定义或者是Expression<>类型。
在Lambda式定义中可以引用外部变量。只要是在定义处能够访问到的变量,都可以在Lambda式中引用。
Lambda式的定义仅仅是定义一个匿名方法,最终会生成一个委托对象。外部变量的引用将被“捕获”到委托对象内部,将会伴随委托对象的整个生命周期。在委托对象生命周期结束之前该变量都不会被垃圾回收。就算外部变量已经超过了原来的作用域,也还能继续在Lambda式中使用。所有会被引用的外部变量必须在Lambda式定义之前被显式赋值。见下例
1.被“捕获”的变量在委托的生命周期结束前都不会被垃圾回收;
2.在Lambda式内部定义的变量对外不可见;
3.
4.Lambda式中的return语句不会导致当前所在的方法返回;
5.Lambda式中不允许包含会导致跳当前执行范围的goto,break 或 continue语句。
四.总结
Lambda式可以说就是另外一种形式的匿名方法。用在某些地方,会使代码更加简洁。定义一个Lambda式本质上就是定义一个委托的实现体。
标签:linq
原文地址:http://blog.csdn.net/liu_yujie2011com/article/details/41621625