lambda匿名函数,var匿名类,扩展方法,迭代器yieid,Linq

E神课程记录 2018-05-16

lambda 是一个方法
C#1.0

NoReturnNoPara method =new NoReturnNoPara(this.DoNoting);

C#2.0

NoReturnNoPara method = new NoReturnNoPara(delegate(){});

C#3.0 lambda :左边是参数列表 gose to 右边是方法体 可以省略参数类型 自动推算的

NoReturnNoPara method = new NoReturnNoPara(()=>{});
NoReturnWithPara method = new NoReturnWithPara((int x,int y)=>{});
NoReturnWithPara method = new NoReturnWithPara((x,y)=>{});
NoReturnWithPara method = (x,y)=>{};

匿名类

Student student = new Student(){id=1,age=2};
Object Object = new{id=1,age=2}; //Object不能直接.id 编译器不允许  可以用反射,dynamic,var来实现获取值
dynamic dmodel= new{id=1,age=2}; //dynamic 会避开编译的检查
var varmodel = new{id=1,age=2};//编译后是有一个真实的类  里面的属性是只读的 不能赋值
var确定类型后是不能改类型的

扩展方法 C#3.0 静态类里面的静态方法,第一个参数类型前面加上this
扩展方法可以用泛型
用途:又要增加方法,又不想(不能)修改类;也就是方便一点
缺点:优先调用类型的实例方法(如果我们自己添加了一个扩展方法,未来别人给这个类添加了这个方法,就有问题了)
注意:扩展基类型,会导致任何子类都有这个方法,而且还可能被覆盖啥的;重复扩张方法 便宜无错 调用的地方报错 二重义
建议:指定类型扩展 越细节越好 不要对基类型,否则对成本太高

public static class ExtendMethod
{
    public static void Sing(this Student student)
    {
          
    }

}
Student student = new Student();
student.Sing(); //即可

Linq To object(Enumerable)
where:完成对数据集合的过滤,通过委托封装完成通用代码,泛型+迭代器起提取特性
select:完成对数据集合的转换,通过委托封装完成通用代码,泛型+迭代器起提取特性(投影)

Linq To sql (Queryable) SQL+ADO.NET
where:完成对数据库的过滤,封装了通用代码AOD.NET,通过表达式目录树解析sql
System.Linq.Expressions.Expression 表达式目录树

Linq To Xml 封装对XML的操作
Linq To Everything!!!

Linq To object
List<Student> list = new List<Student>();
var resulot =  list.Where(s=>s.Age<30); //陈述试语法
public static class ExtendMethod
{
    public static List<T> Where<T>(this List<T>  source,Func<T,bool> func)
    {
        var list = new List<T>();
        foreach(var item in source)
        {
            if(func.Invoke(item))
            {
                list.Add(item);
            }
        }
        return list;
    }
}

迭代器yieid 按需加载 Ienumerable Ienumerable 与 yieid 天生一对 相辅相成

from s in studentlist where s.Age < 30 select s; //查询表达式

查询表达式会转换成陈述试语法


本文由 布墨 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。
阅读:290

还不快抢沙发

添加新评论