Lamdba

前置知识:

  1. Lamdba的演变过程--》匿名方法: 没有 方法名称的方法 并且可以直接访问局部变量
    1. 在.NET Framework1.0中  实例委托必须要给委托传递一个方法 方法返回值 参数必须与委托一致
    2. 在.NET Framework2.0中  实例化委托迎来了简写:匿名方法 需要加上delegate关键字
    3. //定义一个有参数 有返回值的委托

                         Public delegate int MyDelegate(int x, int y); 

                         //实例一个委托 MyDelegate method=new MyDelegate(delegate (int x,int y))

                             { return 2; }                

    4.    .在.NET Framework3.0中  直接把delegate关键字去掉了 使用 goesto 来替代

                             MyDelegate method=(int x,int y)=>return 1;

  2. 匿名类:类型中的内容只能在初始化中赋值,不能修改 他是只读的;  
    1. Dynamic:声明一个不指定具体类型的类 ,因为C#是强类型语言,编译时 编译器会确定类型 是编译器不允许的 导致无法直调用,可以使用 Dynamic关键字 避开编译器检查; 

    2. Var: Var是一个语法糖 ,由编译器自动推算类型
    3. Var 是一个匿名类型:编译器分配名称 `a
    4. var 必须赋值 :因为他需要推算类型 
      1. var 是3.5新出的一个定义变量的类型,其实也就是弱化类型的定义,VAR可代替任何类型

        编译器会根据上下文来判断你到底是想用什么类型的,

        至于什么情况下用到VAR ,我想就是你无法确定自己将用的是什么类型,

        就可以使用VAR 类似 OBJECT 但是效率比OBJECT高点。

        或者通俗的讲:

          var可以理解为匿名类型,我们可以认为它是一个声明变量的占位符

           它主要用于在声明变量时,无法确定数据类型时使用。

         

        使用var定义变量时有以下四个特点:

        1. 必须在定义时初始化。也就是必须是var s = “abcd”形式,而不能是如下形式: var s; s = “abcd”;

        2. 一但初始化完成,就不能再给变量赋与初始化值类型不同的值了。

        3. var要求是局部变量。

        4. 使用var定义变量和object不同,它在效率上和使用强类型方式定义变量完全一样。

  3. 扩展方法
    1. 定义:
      1. 在静态类中 的一个静态方法里面 第一个参数前面加一个 this
      2. 扩展方法
        
        //静态类
        public static  DoNoting
        {
        //静态方法
         public void DonotingMethod(this Student s)
         {
         cw("我是扩展方法");
         }
        }
        Student s=new Student();
        //调用时我们既可以直接静态调用
        DoNoting.DonotingMethod(s);
        //又可以使用扩展方法的形式调用
        s.DonotingMethod();
      3. 扩展方法就像扩展了类的逻辑
      4. 第三方的类,不适合修改源码,可以通过扩展方法增加逻辑
      5. 他会优先调用实例方法 :类型中有一个名称和扩展方法名称一致的方法 
    2. .netcore中:  扩展方法适合组件化开发
      1. 定义接口 类时 是按照最小需求,但是在开发时经常需要一些 扩展方法去处理逻辑 
      2. .netcore中的 Context.Reponse.WriteAsync
      3. 中间件注册 Build.Use,UseWhen, UseWhere, Run

 

1.什么是Lamdba表达式

  1. 解释:
    1. Lamdba是实例委托的参数
    2. 这个参数就是一个方法 可以是匿名的
  2. Lamdba是一个匿名方法
    1. 编译时会生成一个名称为 <>开头的方法
    2. 并且还会生成一个 密封类 在类中包含所所有的lamdba 以<>开头的方法
  3. 多播委托中的特殊的Lamdba
    1. Lamdba表达式在多播委托中是无法移除的
    2. 为什么不能被移除
      1. Lamdba方法 是在一个密封类中定义的  以<>开头的方法
      2. 移除时需要具体方法名称 但是匿名方法没有名称 无法移除 
      3. 虽然直接移除的带方法体的匿名方法 但是 和你真的要移除的方法不是同一个方法
      4. 也就是说 因为是同一个密封类中的两个方法 ,所以无法移除

 

posted @ 2023-01-04 17:59  三五八团楚云飞  阅读(15)  评论(0)    收藏  举报