Lambda表达式基础篇

一.简介

       一个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表达式

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
 
  1. <span style="font-size:18px;">static void Main(string[] args)  
  2.   
  3.          {  
  4.   
  5.              Button btn = new Button();  
  6.   
  7.              btn.Click+=(object obj,EventArgs e)=>{  
  8.   
  9.                  MessageBox.Show("Hello World !");  
  10.   
  11.              };  
  12.   
  13.          }   
  14. </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内执行。

一般来说,让一个方法在原先设计的上下文环境以外执行没有意义,也不能真正工作。

2.语句Lambda

    语句Lambda和表达式Lambda非常相似,只是语句被包含在大括号内:

        (input parameters)=> {statement;}

    大括号中的语句可以是任意多条,也可以写成多行(定义一个Lambda式也就是在定义一个匿名方法):

       TestDelegate myDel= n => { string s = n + " " + "World";

        Console.WriteLine(s);};

    当然语句Lambda跟匿名方法一样,无法用于创建表达式树。

3.类型猜测

    当编写一个Lambda式的时候,我们通常不需要明确指定输入参数的类型。因为编译器会根据Lambda体的实现,以及委托的定义来猜测类型。

    举例:如果要从一个List<int>中删除小于100的元素

        Llst.RemoveAll(i=> i < 100);//i会被猜测为int

通常的猜测规则如下:

       1. Lambda式必须包含与委托定义中相等数量的输入参数;

       2. 每个Lambda式的输入参数必须能够隐式转换成委托定义中所要求的输入参数;

       3.Lambda式的返回值必须能够隐式转换成委托定义中的返回值。

    注意:由于目前在common type system中还没有一个“Lambda式类型的类型。如果在有些场合提到“Lambda式的类型,那通常表示委托的定义或者是Expression<>类型。

4.Lambda式中的变量作用域

    在Lambda式定义中可以引用外部变量。只要是在定义处能够访问到的变量,都可以在Lambda式中引用。

Lambda式的定义仅仅是定义一个匿名方法,最终会生成一个委托对象。外部变量的引用将被捕获到委托对象内部,将会伴随委托对象的整个生命周期。在委托对象生命周期结束之前该变量都不会被垃圾回收。就算外部变量已经超过了原来的作用域,也还能继续在Lambda式中使用。所有会被引用的外部变量必须在Lambda式定义之前被显式赋值。见下例

delegatebool D();

delegatebool D2(int i);

classTest

{

Ddel;

D2del2;

publicvoid TestMethod(int input)

{

intj = 0;

//Initialize the delegates with lambda expressions.

//Note access to 2 outer variables.

//del will be invoked within this method.

del= () => { j = 10;return j > input; };

//del2 will be invoked after TestMethod goes out of scope.

del2= (x) => {return x == j; };

//Demonstrate value of j:

//Output: j = 0

//The delegate has not been invoked yet.

Console.WriteLine("j= {0}", j);

//Invoke the delegate.

boolboolResult = del();

//Output: j = 10 b = True//注意jdel的执行过程中被修改

Console.WriteLine("j= {0}. b = {1}", j, boolResult);

}

staticvoid Main()

{

Testtest = new Test();

test.TestMethod(5);

//Prove that del2 still has a copy of

//local variable j from TestMethod. //j的引用超出了原先定义的作用域

boolresult = test.del2(10);

//Output: True

Console.WriteLine(result);

Console.ReadKey();

}

}

    下面是关于变量作用域的规则:

        1.捕获的变量在委托的生命周期结束前都不会被垃圾回收;

        2.Lambda式内部定义的变量对外不可见;

        3. Lambda式无法直接捕获一个具有refout描述的参数变量;

        4.Lambda式中的return语句不会导致当前所在的方法返回;

        5.Lambda式中不允许包含会导致跳当前执行范围的gotobreak continue语句。

四.总结

       Lambda式可以说就是另外一种形式的匿名方法。用在某些地方,会使代码更加简洁。定义一个Lambda式本质上就是定义一个委托的实现体。

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值