C# 从委托、匿名方法到Lambad表达式

.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"); 
总结

表达式就是一个方法,只是改变了语法的书写方式而已

参考

https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/statements-expressions-operators/anonymous-functions

https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/statements-expressions-operators/anonymous-functions

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值