zoukankan      html  css  js  c++  java
  • C# Lambda

    一、Lambda演变历史

    Lambda 1.0 普通方法

            private void DoNothing()
            {
                Console.WriteLine("This is DoNothing");
            }
    
            private void Study(int id, string name)
            {
                Console.WriteLine($"{id} {name} 正在学习");
            }
    View Code

     声明委托      讲方法作为参数

            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);
    View Code
               {
                    //.NetFramework1.0  1.1
                    NoReturnNoPara method = new NoReturnNoPara(this.DoNothing);
                }
    View Code

    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");
                }
    2.0

    3.0   去掉delegate关键字  将方法用=>连接

                {
                    //.NetFramework3.0   把delegate关键字去掉,增加了一个箭头=>
                    //lambda表达式  参数列表=>方法体
                    NoReturnWithPara method = new NoReturnWithPara(
                        (int id, string name) =>
                    {
                        Console.WriteLine($"{id} {name} 正在学习");
                    });
                    method.Invoke(123, "aaa");
                }
    3.0

     方法的参数类型 可以由委托推算  因此可以省略参数类型

               {
                    NoReturnWithPara method = new NoReturnWithPara(
                        (id, name) =>//省略参数类型,编译器的语法糖,虽然没写,编译时还是有的,根据委托推算
                        {
                            Console.WriteLine($"{id} {name} 正在学习");
                        });
                    method.Invoke(123, "bbb");
                }
    View Code

     进一步简化  当方法只有一行时,可以省略外层的大括号和分号     只有一个参数时可以省略方法的外层括号

               {
                    NoReturnWithPara method = new NoReturnWithPara(
                        (id, name) => Console.WriteLine($"{id} {name} 正在学习"));
                    //如果方法体只有一行,可以去掉大括号和分号
                    method.Invoke(123, "ccc");
                }
    View Code

     委托也可以省略 编译器编译时会自动加上

               {
                    NoReturnWithPara method = (id, name) => Console.WriteLine($"{id} {name} 正在学习");
                    method.Invoke(123, "ddd"); //new NoReturnWithPara可以省掉,也是语法糖,编译器自动加上
                }
    View Code
  • 相关阅读:
    IO多路复用 IO异步
    你没听说过的协程
    事件驱动和IO操作
    堡垒机前戏——paramiko
    听说过的多进程,多线程到底是什么鬼
    socket套接字
    看见就烦的异常
    struts2值栈内部数据结构详解
    hibernate一级缓存的源码初窥
    使用自定义标签模拟jstl的<c:for each>标签
  • 原文地址:https://www.cnblogs.com/Dewumu/p/10652549.html
Copyright © 2011-2022 走看看