Lambda 表达式的简介及形成过程

来源:互联网 发布:剑三道长捏脸数据下载 编辑:程序博客网 时间:2024/05/01 15:19

Lambda 表达式的简介及形成过程


C#的Lambda表达式是一种"语法糖",使用 Lambda 运算符 =>,该运算符读为“goes to”。语法如下:

形参列表=>函数体
函数体多于一条语句的可用大括号括起。
要了解Lambda表达式,首先就要了解什么是委托,委托(delegate)是一种引用类型.简单讲,委托就是一个函数指针.先看一个例子
  //声明一个委托
    public delegate int DelegateAdd(int a, int b);
    public class A
    {
        //静态的处理方法
        public static int Add(int a, int b)
        {
            return a + b + 3;;
        }
    }
    //入口类
    public class B
    { 
        public static void Main()
        {
            //实例一个委托
            DelegateAdd mdh = new DelegateAdd(A.Add);
            //调用委托
            int sum = mdh(2, 2);
            Console.WriteLine(sum.ToString());
        }
    }
    上面是一个非常简单的例子,具体的实现步骤:
           1、 先声明个委托实例 ;
           2、然后提供要处理的方法;
           3、再实例化委托(把委托看作是类的话,实例化委托就不难理解了,其参数是要处理的方法,这里的方法 不用加括号,实例化的过程就是装载方法的过程,就好像需要参数的构造函数一样)实例化后的委托对象就好比是c++中的指针,它本身就是封装了方法的对象;
           4、最后我们调用委托对象就好比是调用了被封装方法本身,调用时的参数也就传给了被封装的方法。
           5、需要注意的是 所声明的委托无论是 参数个数,参数类型,返回值类型 都要和所要封装的方法保持一致,当调用委托实例对象时,所传入的参数也要保持一致 ,否则会出现错误。 
    以上实例是定义了一个A.Add()的方法.但是还有一种方法,就是先不定义,在实例化委托的时候,直接定义一个匿名方法.则以上实例变成了以下代码
    public delegate int DelegateAdd(int a, int b);
    //入口类
    public class B
    { 
        public static void Main()
        {
            //实例一个委托的同时,定义了一个匿名方法
            DelegateAdd mdh = new DelegateAdd(delegate(int a,int b){return a+b+3;});
            //调用委托
            int sum = mdh(2, 2);
            Console.WriteLine(sum.ToString());
        }
    }
    以上方法就是做了一步的改进,使用了匿名方法,就不用在外部在定义方法了.
    进一步的优化以下语句:
DelegateAdd mdh = new DelegateAdd(delegate(int a,int b){return a+b+3;});
    1) 省略了 new DelegateAdd
DelegateAdd mdh = delegate(int a,int b){return a+b+3;};
    2) 省略了关键字 delegate,并加上符号 =>
DelegateAdd mdh = (int a,int b)=>{return a+b+3;};
    3) 省略参数类型
DelegateAdd mdh = (a,b)=>{return a+b+3;};
    4) 省略可以省略的括号,return 等,最终形成Lambda表达式
DelegateAdd mdh = (a,b)=>a+b+3;
    再举个系统常用的委托:Func<T,TResult>. 如下:
1)new Func<string,int>(delegate(string str){return str.length;})  
2)delegate(string str){return str.length;}
3)(string str)=>{return str.length;}
4)(string str)=>str.length;
5)(str)=>str.length;
6)str=>str.length;
0 0