C# Lambda

一、Lambda演变历史

Lambda 1.0 普通方法

        private void DoNothing()
        {
            Console.WriteLine("This is DoNothing");
        }

        private void Study(int id, string name)
        {
            Console.WriteLine($"{id} {name} 正在学习");
        }
View Code

 声明委托      讲方法作为参数

        public delegate void NoReturnNoPara();
        public delegate void NoReturnWithPara(int x, string y);//1 声明委托
        public delegate int WithReturnNoPara();
        public delegate string WithReturnWithPara(out int x, ref int y);
View Code
           {
                //.NetFramework1.0  1.1
                NoReturnNoPara method = new NoReturnNoPara(this.DoNothing);
            }
View Code

2.0    出现了匿名方法  使用delegate关键字 声明

            {
                //.NetFramework2.0  匿名方法,delegate关键字
                //可以访问局部变量
                NoReturnWithPara method = new NoReturnWithPara(delegate (int id, string name)
                {
                    Console.WriteLine(i);
                    Console.WriteLine($"{id} {name} 正在学习");
                });
                method.Invoke(1, "name");
            }
2.0

3.0   去掉delegate关键字  将方法用=>连接

            {
                //.NetFramework3.0   把delegate关键字去掉,增加了一个箭头=>
                //lambda表达式  参数列表=>方法体
                NoReturnWithPara method = new NoReturnWithPara(
                    (int id, string name) =>
                {
                    Console.WriteLine($"{id} {name} 正在学习");
                });
                method.Invoke(123, "aaa");
            }
3.0

 方法的参数类型 可以由委托推算  因此可以省略参数类型

           {
                NoReturnWithPara method = new NoReturnWithPara(
                    (id, name) =>//省略参数类型,编译器的语法糖,虽然没写,编译时还是有的,根据委托推算
                    {
                        Console.WriteLine($"{id} {name} 正在学习");
                    });
                method.Invoke(123, "bbb");
            }
View Code

 进一步简化  当方法只有一行时,可以省略外层的大括号和分号     只有一个参数时可以省略方法的外层括号

           {
                NoReturnWithPara method = new NoReturnWithPara(
                    (id, name) => Console.WriteLine($"{id} {name} 正在学习"));
                //如果方法体只有一行,可以去掉大括号和分号
                method.Invoke(123, "ccc");
            }
View Code

 委托也可以省略 编译器编译时会自动加上

           {
                NoReturnWithPara method = (id, name) => Console.WriteLine($"{id} {name} 正在学习");
                method.Invoke(123, "ddd"); //new NoReturnWithPara可以省掉,也是语法糖,编译器自动加上
            }
View Code
原文地址:https://www.cnblogs.com/Dewumu/p/10652549.html