delegate
是一个delegate修饰的方法,
1、在IL中。委托就是一个类,继承自一个MulticastDelegate类,里边有构造函数、以及invoke()、begininvoke,endinvoke等一些方法
2、委托的实例化。要求传递一个参数类型。返回值都跟委托完全一致的方法。
3、委托实例的调用。参数和委托约束的一致。
委托这个类的实例可以放入一个方法,实例Invoke的时候执行这个方法。
委托的好处:
即增加公共逻辑方便、又逻辑分离维护简单。
自上往下:逻辑解耦、方便维护升级
自下往上:代码重用,去掉重复代码
Action Func
.Net FrameWork3.0的时候出现。
Action 是没有返回参数的委托,这里的参数最多可以写16个参数
Func<int,string>是有返回值的委托,同样是16个参数。1个返回值
多播委托
在一个方法中添加多个实例
//+=给委托的实例添加方法,会形成方法连,Invoke时,会按照顺序执行系列方法
Action method=this.dosomethIng
method+=this.donothing;
method+=new student().study;
method.Invoke();
//-=给委托的实例移除方法,从方法链的尾部开始匹配。遇到第一个完全吻合的。移除。并且只移除一个。如果没有匹配。就啥事都不发生
Action method-=this.dosomethIng
method-=new student().study;//去不掉。原因。不同实例的相同方法。并不吻合
method.Invoke();
多播委托不能使用异步方法。beginInvoke(null,null);
如果多播委托想异步执行。则需要
遍历一下
foreach(Action item in method.GetInvocationList()){
item .beginInvoke();
}
多播委托中lambda表达式也不能去掉。因为两个lambda表达式是两个不同的方法。IL中生成了两个不同名字的
事件Event
就是一个带有Event关键字的委托,限制了权限。只能在事件声明类里边进行Invoke和赋值。不允许外面、甚至子类也不可以。
事件和委托的区别和联系?
委托是一种类型。事件是委托类型的一个实例加上了Event的权限控制
Student是个类型。tony就是Student类型的一个实例
事件(观察者模式)能把固定动作和可变动作分开。完成固定动作,把可变动作分离出去
委托的发展
//1.0 1.1
NoReturn method=new NoReturn(this.doNothing);
//2.0 匿名方法。delegate关键字
NoReturn method=new NoReturn(delegate (int a){
CW(XXX);});
//3.0 lambda表达式
NoReturn method=new NoReturn((int a)=>{
CW(XXX);});
//最终可以简化成这样
NoReturn method= a=>CW(XXX);
//
lambda
lambda表达式只是实例化委托的一个参数,就是个方法
是匿名方法,但是编译的时候会分配一个名字
还会产生一个私有的sealed类。这里增加了一个方法
匿名类 var
匿名类只能初始化的时候指定他的值。而且必须初始化,之后不能进行修改。
扩展方法 3.0
静态方法。静态类。方法的第一个参数用this,来增强方法。
1、若存在第三方的类。不适合修改源码,可以通过扩展方法增加逻辑
优先调用实例方法,
2、适合组件开发的扩展(.NEtCore)定义接口或者类。是按照最小需求,但是在开发的时候小一些其他方法。则可以扩展
3、扩展一些常见操作
4、会污染基础类型。一般少为Object,没有约束的泛型去扩展
public static class Extend
{
public static void ex(this Student student)
{
cw(“我被增强了e”)
}
}
Student.ex();
Linq
Linq TO OBject 在Enumberable类中。针对IEnumberable数据,指的是内存数据
Linq-Where :把对数据过滤的通用操作完成。把可变的过滤逻辑交给委托
Linq-Select :把对数据过滤的通用操作完成。把可变的过滤逻辑交给委托
Linq就是把对数据操作的通用部分完成。把可变的交给委托,使用者只用关心可变部分
where是一种泛型扩展方法,里边的参数是一个func<>委托
public static IEnumerable<Tsource> Where<Tsource>(this IEnumerable<Tsource>,Func<Tsource,bool> p){}
Select是投影
public static IEnumerable<Tsource> Select<Tsource,Tout>(this IEnumerable<Tsource>,Func<Tsource,TOut> selector){}
skip之前必须要有Orderby;
group by先按照一个对象分组。然后插入一个新的表。key就是这个分组的值。可以理解为
HashTable<String,List>;
Linq to Sql 则是IQueryable 类型的数据。里边的参数是一个表达式目录树包装的一个Func委托
Sql则是通过表达式目录树去传递的。将来可以通过表达式目录树来解析。
Linq to XML封装一下通用的对XML文件的操作,可变的通过委托来传递。
IQueryable list=studentlist.AsQueryable();
Lambda和linq
Lambda是实例化委托的快捷方式
linq是委托的封装,逻辑解耦代码重用
Yield return
迭代器IEnumerable中可以使用,按需获取,