各个版本的委托实例化:
.NET Framework 1.0
//.NET Framework 1.0
public delegate void DoDel(int num,string name);
public void Say(int num, string name)
{
Console.WriteLine($"{name}, {num}点有空吗!");
}
{
DoDel doSome = new DoDel(this.Say);
doSome.Invoke(8, "小美");
}
//语法糖模式
{
DoDel doSome = this.Say;
doSome.Invoke(8, "小美");
}
.NET Framework 2.0
匿名方法 delegate 关键字 不用在踏踏实实的去写方法,直接写在这里
而且还可以使用上边的作用域变量,这是普通做法办不到的
//给下边的匿名方法使用
int i = 1;
//.NET Framework 2.0 匿名方法 delegate 关键字 不用在踏踏实实的去写方法,直接写在这里
//而且还可以使用上边的作用域变量,这是普通做法办不到的
{
DoDel doSome = new DoDel(
delegate(int num, string name){
Console.WriteLine($"{name}, {num}点有空吗!");
Console.WriteLine($"i:{i}");
}
);
doSome.Invoke(8,"小美");
}
.NET Framework 3.0
去掉 delegate 关键字 换乘 => 念做 "goes to"
lamada 表达式诞生 参数列表=>方法体
{
int i = 1;
DoDel doSome = new DoDel(
(int num, string name)=> {
Console.WriteLine($"{name}, {num}点有空吗!");
Console.WriteLine($"i:{i}");
}
);
doSome.Invoke(8, "刘亦菲");
}
.NET Framework 3.0 以后无版本变化 ,只有小修改
语法糖 : 参数可以不写类型 ,因为委托已经写了类型,方法的参数必须一致
//语法糖 : 参数可以不写类型 ,因为委托已经写了类型,方法的参数必须一致
{
DoDel doSome = new DoDel(
(num,name) => {
Console.WriteLine($"{name}, {num}点有空吗!");
Console.WriteLine($"i:{i}");
}
);
doSome.Invoke(8, "刘亦菲");
}
再精简
语法糖 : 一行代码可以去掉 {} ,再省略掉外边的 new DoDel()
//再精简
//语法糖 : 一行代码可以去掉 {} ,再省略掉外边的 new DoDel()
{
DoDel doSome = (num, name) =>Console.WriteLine($"{name}, {num}点有空吗!");
doSome.Invoke(8, "刘亦菲");
}
问题: lamada表达式是什么?
拉姆达表达式就是实例化委托需要的参数, 即 方法(匿名方法);
匿名方法在编译时,系统会分配一个名称 如下 反编译的结果: 所以Lamada 表达式在 委托中无法移除
还会产生一个 私有的密封类 private sealed <>c