委托实例化的进化--引出匿名方法--到Lamada表达式的诞生

各个版本的委托实例化:

.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

猜你喜欢

转载自blog.csdn.net/qq_36445227/article/details/90713172
今日推荐