一、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可以省掉,也是语法糖,编译器自动加上
}
