一、Lambda演变历史
Lambda 1.0 普通方法
private void DoNothing() { Console.WriteLine("This is DoNothing"); } private void Study(int id, string name) { Console.WriteLine($"{id} {name} 正在学习"); }
声明委托 讲方法作为参数
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);
{ //.NetFramework1.0 1.1 NoReturnNoPara method = new NoReturnNoPara(this.DoNothing); }
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"); }
3.0 去掉delegate关键字 将方法用=>连接
{ //.NetFramework3.0 把delegate关键字去掉,增加了一个箭头=> //lambda表达式 参数列表=>方法体 NoReturnWithPara method = new NoReturnWithPara( (int id, string name) => { Console.WriteLine($"{id} {name} 正在学习"); }); method.Invoke(123, "aaa"); }
方法的参数类型 可以由委托推算 因此可以省略参数类型
{ NoReturnWithPara method = new NoReturnWithPara( (id, name) =>//省略参数类型,编译器的语法糖,虽然没写,编译时还是有的,根据委托推算 { Console.WriteLine($"{id} {name} 正在学习"); }); method.Invoke(123, "bbb"); }
进一步简化 当方法只有一行时,可以省略外层的大括号和分号 只有一个参数时可以省略方法的外层括号
{ NoReturnWithPara method = new NoReturnWithPara( (id, name) => Console.WriteLine($"{id} {name} 正在学习")); //如果方法体只有一行,可以去掉大括号和分号 method.Invoke(123, "ccc"); }
委托也可以省略 编译器编译时会自动加上
{ NoReturnWithPara method = (id, name) => Console.WriteLine($"{id} {name} 正在学习"); method.Invoke(123, "ddd"); //new NoReturnWithPara可以省掉,也是语法糖,编译器自动加上 }