委托声明实例化调用
委托是一个类型,大部分情况声明的和类同级别。偶尔会嵌套在类内部。
delegate string OneRetOnePar(string p_Name); #region 简单委托 OneRetOnePar ornp = new OneRetOnePar(u.GetUserName); Console.WriteLine(ornp("藏锋")); #endregion
委托可以认为是一个具有相同参数返回值的方法地址集合,返回最后一个方法的返回值。
多播委托
委托可以进行
+=
-+(匿名方法减不掉)
维护一个方法列表
不能begininvok()异步调用
委托作用和意义
delegate委托是一个关键字,他编译之后生成的类型继承了MulticastDelegate,而MulticastDelegate继承了类型Delegate.
委托里面放的是一个方法列表。就是说,可以把逻辑放在委托里面,作为参数参数。实现上下端分离。下端不是面向具体的业务,而是一套通用的框架处理。
1、异步多线程,都是基于委托的。
3、封装 扩展 解耦,因为委托是一个类型,用的时候实例化成一个对象, 把一段逻辑封装到已给变量里面,可以把逻辑作为参数传递,达到逻辑拆分,具有扩展性(下端不要写死,上单定制逻辑)。也可以可以达到解耦的作用。最常见的就是linq where()里面的条件逻辑(委托),
2、多播委托(不能异步)
包含了三个方法,基类为多波委托
异步三个参数 第一个为方法参数 第二个为回调函数(可为NULL) 第三个为状态(可为NULL)
观察者模式
事件发布者(就是事件所在的类)
订户(具体的操作方法)
订阅(把方法绑定到事件上的动作叫做订阅)
事件
事件是委托的一个实例
委托是一个类型
从图上可以看出,事件是在委托委托前面加了一个event。
event只能由声明event的类调用(添加了控制权限)。event关键字控制了委托实例的权限
中间语言中事件会自动生成两个方法,来操控委托