.Net Framework1.0引入了委托,.NetFramework2.0引入了匿名方法,.NetFramework3.0引入Lambad表达式
匿名方法是通过使用 delegate 关键字创建委托实例来声明的,可以使用来初始化命名委托,所以说匿名方法是一个委托的实例,Lambad表达式也是一个匿名方法,所以Lambad表达式也是个委托实例
委托到Lamba表达式的演变,先定义一个show方法:
public void Show(int id, string name)
{
Console.WriteLine($"{name}的ID是{id} ");
}
.Net Framework1.0 或1.1的实例化委托要指定方法名称,在委托调用时要先声明一个方法,例如show方法
//.NetFramework1.0 1.1
NoReturnNoParameter noParaMethod = new NoReturnNoParameter(this.Show);
noParaMethod.Invoke();
noParaMethod();//Invoke与直接调用一样
到 .Net Framework2.0 时有了匿名方法,可以不先声明方法,而直接用匿名方法
NoReturnWithParameter paraMethod = new NoReturnWithParameter(delegate (int x, string y)
{
Console.WriteLine($"{y}'s ID is {x}");
});
paraMethod.Invoke(202, "Emma");
到了 .Net Framework3.0 把delegate关键字去掉,增加了一个箭头goes to,就是lambda表达式 参数列表=>方法体
//.NetFramework3.0 把delegate关键字去掉,增加了一个箭头goes to
//lambda表达式 参数列表=>方法体
NoReturnWithParameter paraMethod = new NoReturnWithParameter(
(int x, string y) =>
{
Console.WriteLine($"{y}'s ID is {x}");
}
);
paraMethod.Invoke(303, "Jennifer");
还可以进一步省略匿名方法的参数类型,这是编译器的语法糖,虽然没写,编译时还是有的,根据委托推算出来
NoReturnWithParameter paraMethod = new NoReturnWithParameter(
(x, y) =>
{
Console.WriteLine($"{y}'s ID is {x}");
}
);
paraMethod.Invoke(404, "Daisy");
new NoReturnWithPara可以省掉,也是语法糖,编译器自动加上
NoReturnWithParameter paraMethod = (x, y) =>
{
Console.WriteLine($"{y}'s ID is {x}");
};
paraMethod.Invoke(505, "Bonnie");
如果方法体只有一行,可以去掉大括号,一是一般情况下看到的lambda表达式,如果方法体有多行还是要大括号
NoReturnWithParameter paraMethod = (x, y) => Console.WriteLine($"{y}'s ID is {x}");
paraMethod.Invoke(606, "Elizabeth");
总结
表达式就是一个方法,只是改变了语法的书写方式而已