• 浅入浅出Lambda表达式


    大家在开发中会经常看到也会经常使用lambda表达式。

    园子里也有很多详解lambda表达式的文章,多是从横向来讲述。

    但lambda表达式到底如何变成现在这个样子,表达式的形式到底代表什么含义,这些可能就不太明白了。

    本文将从来源开始,纵向剖析,一直演化出我们常用的lambda表达式。

    引子

    为方便说明,先举个例子,列出Lambda表达式的一个典型形式:

    x=>x+1

    大家可以看到,Lambda表达式的语法由三部分组成,分别为:

    1. Lambda运算符 => 读作goes to;

    2. 左边参数部分 x ;

    3. 右边的Lambda主体

    可以看出,其实所谓的Lambda表达式(lambda expression)就是一个匿名函数,或者说是匿名函数的简单形式。而匿名函数的作用就是分配给委托类型的。

    假设我们声明一个委托:

    delegate int Mydel(int x);

    lambada 表达式(匿名函数)用来填充委托变量:

    Mydel del= x=>x+1;

    我们就从这个例子说开去。

    演化过程

    刚刚说过,lambda表达式就是匿名方法的简写形式,说到lambda表达式就要说到匿名方法,而匿名方法就是初始化委托时内联声明的方法。

    因此我们先从委托说起,一直推导出 lambda表达式Mydel del=x=>x+1; 的形式。

    和类相似,委托是用户自定义的引用类型。

    类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定义操作。

    可以将委托类比为类,创建和使用的过程如下:

    1.声明类型

    2.声明类型的变量

    3.填充变量

    4.使用变量

    对应着四步的完整例子:

    delegate int Mydel(int x);

    Mydel del;

    del=new Mydel(xxx方法); //也可以直接用简化写法 del=xxx方法;

    del(2);

    以上第三步中初始化委托使用 xxx方法 。

    如果方法专门用来初始化委托,只会被使用一次,这种情况下,除了创建委托的语法需要,没有必要创建独立的具名方法,这样就引出了匿名方法。

    匿名方法是在初始化委托时内联声明的方法,非匿名方法的例子如下:

    public static int Add1(int x)

    {

        return x+1 ;

    }

    delegate int MyDel(int x);

    调用:

    MyDel del=Add1;

    del(2);

    改造成用匿名方法的完整例子:

    delegte int MyDel(int x);

    调用:

    MyDel del=delegate(int x) { return x+1;}

    del(2);

    从例子中提取出匿名方法的语法:

    delegate(Parameters) { ImplementationCode }

    几个注意点:

    1. 返回值:不显示声明返回值,与委托相同

    2. 参数

    以下情况可以使用圆括号为空或省略圆括号来简化参数列表。

    a. 不包括任何out 参数 b. 不使用任何参数

    满足上面两个条件即可省略参数列表,例子:

    delegate int SomeDel();

    SomeDel sDel = delegate { return 1; };

    3.params 参数

    如果委托声明的参数列表包含了 params 参数(可变数目参数),匿名方法的参数列表将忽略params关键字

    delegate void SomeDel(int x, params int[] y);

    SomeDel sDel = delegate(int x, int[] y) { … }

    匿名方法准备好了,我们稍加变化,就可以得出Lambda表达式

    以 MyDel del=delegate(int x) { return x+1;} 为例。

    转换步骤:

    1.删除delegate关键字,在参数列表和匿名方法主体之间放 =>

    MyDel del = (int x) => {return x+1; } ;

    可以进一步简化

    2. 去掉参数类型

    MyDel del2 = (x) => {return x+1; } ;

    说明:

    编译器可以从委托声明中知道委托参数的类型,因此可以省略类型。

    带有类型的参数列表称为显式类型。

    省略类型的参数列表称为隐式类型。

    3.去掉参数刮号

    MyDel del3 = x => {return x+1; } ;

    说明:

    如果只有一个隐式类型参数,可以省略刮号。

    4.去掉主体的大刮号及return

    MyDel del4 = x=> x+1;

    说明:

    Lambda表达式允许表达式的主体是语句块或表达式。

    如果语句块包含一个返回语句,可以将语句块替换成return 后面的表达式。

    这样就得到我们文章开头的形式。

    总结

    C#2.0引入了匿名方法,C#3.0引入了lambda表达式,可以看到,lambda表达式简化了匿名函数的使用,让代码更加简洁。

    理解了这篇文章,相信大家对lambda表达式就会有一个整体的把握,再学具体用法时思路会很清晰。

    祝学习进步~

  • 相关阅读:
    HDU1163 Eddy's digital Roots【九剩余定理】
    【ThinkingInC++】8、说明,浅谈数据类型的大小
    教你如何使用U盘装系统
    图像不显示该问题的解决方案
    HTTP相关概念
    AndroidUI的组成部分GridView
    uploadify 3.2 后台动态传参数
    Oracle11g创建表空间语句
    Uncaught RangeError: Maximum call stack size exceeded解决思路
    panel,dialog,window组件越界问题汇总
  • 原文地址:https://www.cnblogs.com/ldyblogs/p/lambda.html
Copyright © 2020-2023  润新知