星星之火

燎原之势不可挡
posts - 127, comments - 374, trackbacks - 0, articles - 3
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

.NET知识梳理——6.lambda

Posted on 2020-02-25 16:02  星星之火116  阅读(...)  评论(...编辑  收藏

1. lambda

1.1        匿名方法lambda表达式

Lambda表达式

Lambda是一个匿名方法,实例化委托的一个参数,编译的时候会产生一个密封类,同时增加一个方法。

Lambda表达式的演化

过程如下:

public delegate void ShowInfo(string name, int age);

1.1.1  .NET Framework 1.0

ShowInfo showInfo = new ShowInfo(GetInfo);

showInfo.Invoke("Olive", 16);

1.1.2  .NET Framework 2.0 匿名方法,delegate关键字

showInfo = new ShowInfo(delegate (string name, int age) {

                Console.WriteLine($"2.0:Age is {age},Name is {name}");

            });

            showInfo.Invoke("墨遥", 30);

1.1.3  .NET Framework 3.0 去掉delegete关键字,增加一个箭头

showInfo = new ShowInfo((string name, int age) => {

                Console.WriteLine($"3.0:Age is {age},Name is {name}");

            });

            showInfo.Invoke("XF", 116);

            showInfo = new ShowInfo((name, age) =>//省略参数类型,编译器的语法糖,根据委托推算,编译时有类型

            {

                Console.WriteLine($"语法糖:Age is {age},Name is {name}");

            });

            showInfo.Invoke("HY", 20);

showInfo = new ShowInfo((name, age) => Console.WriteLine($"语法糖:Age is {age},Name is {name}   如果方法体只有一行,可以去掉大括号"));

            showInfo("遥", 21);

            showInfo=(name,age)=>Console.WriteLine($"语法糖:Age is {age},Name is {name}   可以省略new 委托 ");

            showInfo("哈哈", 18);

1.2        匿名类 var 扩展方法

1.2.1 匿名类 var

.NET Framework 3.0 出现匿名类var。如下所示:

var person = new { Id = 1, Name = "Olive", Age = 16 };

//匿名类属性只能在创建时赋值,不能修改属性值

1.2.2 扩展方法

扩展方法,静态类中的静态方法,第一个参数前加this 修饰

    public static class ExtendMethod

    {

        public static void ShowInfo(this Person p)

        {

            Console.WriteLine($"Person Info is Id={p.Id},Name={p.Name},Age={p.Age}");

        }

}

调用如下:

  Person p = new Person() { Id = 116, Name = "Olive", Age = 30 };

            p.ShowInfo();//ShowInfo即为扩展方法,Person本身并无此方法。

扩展方法调用,很像实例方法,就像扩展了Person的逻辑

扩展方法的使用场景:

  1. 第三方的类,不适合修改源码,可以通过扩展方法增加逻辑
  2. 适合组件式开发的扩展(.NetCore),定义接口或者类,是按照最小需求,但是在开发的时候又经常需要一些方法,就通过扩展方法
  3. 扩展一些常见操作(会污染基础类型,一般少为object  没有约束的泛型去扩展)               

1.3        Linq to object

Linq To Object 是在Enumerable类,针对IEnumerable数据(指的是内存数据)进行的一些列的封装。

Where:把对数据过滤的通用操作完成,把可变的过滤逻辑交给委托

Select:把对数据转化的通用操作完成,把可变的转换逻辑交给委托

OrderBy:排序