• lambda表达式详解


    对于从来没接触过lambda表达式的人来说,这个玩意很蛋疼,蛋疼的语法,蛋疼的外表,但是就和人一样,如果长得太突出(丑),一般就会有大才,毕竟老天是公平的嘛!

    在具体分析lambda之前,先说两句:

    1.lambda表达式不是必须的,因为其就是一个匿名函数,凡是通过lambda表达式可以完成的工作,都可以通过匿名函数来完成(当然,我们也知道,匿名函数也不是必须的)。

    2.lambda表达式可以极大简化我们对匿名函数的使用.

    3.学习lambda表达式之前你最好对匿名函数、委托、泛型的概念有所了解。

    MSDN定义:Lambda 表达式是一种可用于创建委托表达式目录树类型的匿名函数

    通过上面的定义我们可以了解:

    1.lambda表达式是匿名函数,只不过长得不太像而已,可以看成是进化版。

    2.lambda表达式是用来创建委托或者目录树的匿名函数

    目录树是何许人也,放到其他章节说,这里只说lambda表达式创建委托。

      首先,创建一个委托

    delegate int del(int arg);
    

      然后创建一个符合这个委托定义的方法

    static int Func1(int numb)
            {
                return numb + 10;
            }
    

      创建委托del的实例,这里创建委托的方法我们用的是最基本的方法。

    static void Main(string[] args)
            {
                del d1 = new del(Func1);
                Console.WriteLine(d1(10));
                Console.ReadKey();
            }
    

      好,上面我们创建了委托del的实例。

    我们知道如果一个方法可能只用一次,我们就没必要单独创建这个方法,而是可以使用匿名函数。那么我们假设Func就是那个只使用一次的函数,我们可以将上面的创建委托的实例的代码改为使用匿名函数的版本。

     static void Main(string[] args)
            {
                del d1 = delegate(int numb)
                {
                    return numb + 10;
                };
                Console.WriteLine(d1(10));
                Console.ReadKey();
            }
    

      分析一下这个匿名函数:delegaet关键字、匿名函数的参数的类型和形参名称、函数体,还能不能更简单一点呢?继续看,主角来了

     static void Main(string[] args)
            {
                del d1 = p => p + 10;
                Console.WriteLine(d1(10));
                Console.ReadKey();
            }
    

      p=>p+10就是lambda表达式,我们来分析一下,很简单的哟

    1.=>读作“成为”、"转成",英文读作"goes to"

    2.=>左边的p表示调用方法时给方法传入的参数

    3.=>右边的p+10,表示方法体

    对比上面使用匿名函数创建委托实例,左边的p就相当于 numb,右边的p+10就相当于{return p+10;}

    我们可以乐观的认为,lambda表达式在编译阶段仍然转换成了对应的匿名函数,别问我怎么知道,我猜的!

    画张图表示一下。

    所以我们前面说过,lambda表达式也是匿名函数,只不过简化了匿名函数的使用。

    所以我们前面也说,lambda表达式是用来创建委托的,你看我们刚才不就是再创建委托的实例吗?!

    所以到现在为止,你应该记住一句话:lamb表达式没什么特殊之处,只不过是C#的一种语言特性而已,或者说一种语法而已。

    道理明白了,下面我们来稍微加强一点。

    定义一个两个参数的委托

    delegate int del(int arg1,int arg2);
    

      自己试试,首先使用匿名函数的方式创建这个委托的一个实例,然后再使用lambda表达式看看。

      使用匿名函数

    del d1 = delegate(int numb1, int numb2)
                {
                    return numb1 + numb2;
                };
                Console.WriteLine(d1(10,10));
                Console.ReadKey();
    

      使用lambda表达式

     del d1 = (p, z) => p + z;
                Console.WriteLine(d1(10,10));
                Console.ReadKey();
    

      没错,两个参数的时候就是使用括号括起来,用都好分割两个参数,这里p就表示numb1,z就表示numb2。

    我们稍微弄个复杂点的:定义一个购物的委托

    /// <summary>
            /// 定义一个购物的委托,分别接受两个参数
            /// </summary>
            /// <param name="spend">实际消费金额</param>
            /// <param name="cash">付给商家的金额</param>
            /// <returns>商家找回的金额</returns>
            delegate double ShoppingDelegate(double spend, double cash);
    

      使用匿名方法的方式创建这个委托的实例,方法的逻辑稍微复杂点

    ShoppingDelegate d1 = delegate(double spend, double cash)
                {
                    /*变量card表示会员卡上的金额,我们都有经验,如果经常会将几毛钱存入会员卡,方便下次使用,这样可以少带零钱。如果会员卡的金额>0.5,则将会使用会员卡上的金额;否则不适用*/
                    double card = 0.5;
                    if (card > 3)
                    {
                        return cash - spend + card;
                    }
                    else 
                    {
                        return cash - spend;
                    }
                };
    

      这样该如何改成lambda表达式呢?没错,如果代码比较多的话,lambda表达式也使用{}。

    ShoppingDelegate d1 = (p,z)=>
                {
                    /*变量card表示会员卡上的金额,我们都有经验,如果经常会将几毛钱存入会员卡,方便下次使用,这样可以少带零钱。如果会员卡的金额>0.5,则将会使用会员卡上的金额;否则不适用*/
                    double card = 0.5;
                    if (card > 3)
                    {
                        return z - p + card;
                    }
                    else 
                    {
                        return z - p;
                    }
                };
    

      有人会问,为什么lambda表达式中的参数p和z不用spend和cash表示呢?当然可以了,只不过lambda表达式比较叼,能用一个字符表示的,绝对不使用一个半。

    好,这一节就到这里,下一节专门说说lambda表达式和linq的配合使用。

  • 相关阅读:
    ASP.NET中JS简单调用webservices的方法
    WINDOWS SERVER 2003使用IIS服务配置WEB站点(转)
    Tomcat安装配置(转)
    javascript 调用.net后台的数据 和方法
    win7下,sql2005安装,提示 iis功能和com+目录要求 的解决
    Vista或windows7远程桌面控制服务器较慢 反应迟钝
    Asp.net Ajax的使用
    记录远程登陆用户的IP
    Ext.menu.Menu 属性及基础应用
    关于VS2005 无法使用切换到设计视图的解决方法
  • 原文地址:https://www.cnblogs.com/wenriyao/p/4560093.html
Copyright © 2020-2023  润新知