委托\事件\lambda\linq

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);
如果多播委托想异步执行。则需要
遍历一下

foreachAction 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(delegateint 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<TsourceTout>(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中可以使用,按需获取,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值