lambda的变迁史
在.NetFramework1.0 1.1的时候,实例化委托之前我们还必须要去声明一个与委托相对应的方法,然后通过new 委托名称(传入方法)的形式去实例化委托
在.NetFramework2.0 的时候,加入了 匿名方法,此时我们去示例化委托,不再需要单独去声明一个方法,通过new 委托名称(delegate (参数Type typeName));的形式去实例化
在.NetFramework3.0的把delegate关键字去掉,增加了一个=> 读goes to,通过new 委托名称((参数Type typeName)=>{方法体});的形式去实例化.
在往后的版本中进行优化,最终形成 委托名称 _name=(参数name)=>方法体。这里可以不用写参数类型是因为根据委托可以推算参数类型(也可以说是委托限制了,你必须传入和委托一样的类型)
如果方法体中的代码只有一行,那么可以省略()和{}
NoReturnWithPara method = (id, name) => Console.WriteLine($"{id} {name} 学习.Net");
代码示例:
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); public void Show() { //lambda演变历史 { //.NetFramework1.0 1.1 NoReturnNoPara method = new NoReturnNoPara(this.DoNothing); } int i = 10; { NoReturnWithPara method = new NoReturnWithPara(this.Study); method.Invoke(123, "张三"); } { //.NetFramework2.0 匿名方法,delegate关键字 //可以访问局部变量 NoReturnWithPara method = new NoReturnWithPara(delegate (int id, string name) { Console.WriteLine(i); Console.WriteLine($"{id} {name} 学习.Net"); }); method.Invoke(234, "李四"); } { //.NetFramework3.0 把delegate关键字去掉,增加了一个箭头goes to //lambda表达式 参数列表=>方法体 NoReturnWithPara method = new NoReturnWithPara( (int id, string name) => { Console.WriteLine($"{id} {name} 学习.Net"); }); method.Invoke(123, "王五"); } { NoReturnWithPara method = new NoReturnWithPara( (id, name) =>//省略参数类型,编译器的语法糖,虽然没写,编译时还是有的,根据委托推算 { Console.WriteLine($"{id} {name} 学习.Net"); }); method.Invoke(123, "赵六"); } { NoReturnWithPara method = new NoReturnWithPara( (id, name) => Console.WriteLine($"{id} {name} 学习.Net")); //如果方法体只有一行,可以去掉大括号和分号 method.Invoke(123, "周七"); } { NoReturnWithPara method = (id, name) => Console.WriteLine($"{id} {name} 学习.Net"); method.Invoke(123, "孙九"); //new NoReturnWithPara可以省掉,也是语法糖,编译器自动加上 } }