委托
类比:委托是函数指针,事件是保存多个函数指针的数组
使用委托步骤:
- 声明委托:委托类似函数指针,所以定义委托的签名(即参数个数、类型)后,委托的签名就对应了可由委托引用的方法
public delegate int ADelegate(string m); //定义了一个名为ADelegate的委托,可引用任何带有单一string的方法
- 定义/找到委托可引用的方法:方法签名与委托签名同
private int AFunction(string m); //一个名为AFunction的方法,带有单一string参数
- 委托实例化:声明委托类型后,需要创建委托对象,且创建时需要把委托可引用的方法的函数名作为参数传递给该委托的构造函数
PS:委托可引用的方法可以是静态方法,也可以是实例方法
(静态方法与实例方法区别:
外部调用静态方法时,可以使用"类名.方法名"/"对象名.方法名"的方式
实例方法只有“对象名.方法名“这种方式。
即调用静态方法可以无需创建对象。)
ADelegate ad=new ADelegate(AFunction);
- 使用委托:用委托的实例调用函数
ad(“写点啥”);
由上述定义可见委托的作用及使用场景:
- 把要把方法作为实参来传递——可提高函数通用性
- 可将方法封装在委托对象内,直接调用委托对象,而不必在编译时知道将调用哪个方法——简化编程
- 被委托定义的方法在传入对应的方法时候,会监测对应的方法参数和方法类型,不会传入不符合的参数类型——委托类型安全
事件
理解:
表面理解用户点击鼠标后弹出窗口,系统触发后生成的通知都属于事件
深层理解是当对象状态发生改变时,发出的信息或通知
事件采用发布-订阅模型——发出信息的对象为"发布器",对事件处理的方法为"订阅器”
通常发布器在发出状态改变信息时,并不知道由哪个订阅器来处理,所以需要一种管理机制来协调发布器和订阅器,C#中事件使用委托来为触发时将调用的方法提供类型安全的封装
使用事件步骤:
PS:1、2步在发布器类中定义
- 声明事件的委托类型:委托类型定义了处理事件的方法类型,常见委托命名方法是传递方法名+EventHandler
public delegate void OwnEventHandler (string m);//定义一个名为OwnEventHandler的委托
- 声明事件本身: 用event来声明事件
public event EventDelegate OwnEvent;//定义一个名为OwnEvent的事件,事件生成时会调用委托
PS:3在订阅器类中定义,有时事件的发布者也可以是事件的订阅者,且一个事件可以有多个订阅者
- 订阅器中编写符合委托签名的方法:为订阅事件做准备
pubic void Method(string m);
PS:4可在订阅器中也可在Main中
- 订阅事件:只有订阅事件的对象才会收到发生事件的通知,
事件名+=new 委托名(方法名);//注意添加的是整个方法,方法名不需要加括号
假设发布器类名为pub实例化对象名为Publish,订阅器实例化对象名为Book
Publish. OwnEvent+=new pub. OwnEventHandler (Book.Method);//C#1.0的老用法
新用法:
Pub Publish=new pub();
Publish. OwnEvent+= Method;
- 引发事件:即调用事件,可用条件语句或函数来引发,此时会调用订阅事件的委托
public void TouchEvent()
{
OwnEvent();
}
//用TouchEvent方法引发事件 OwnEvent
系统中有些定义好的委托类型如:
public delegate void EventHandler(object
sender, EventArgs e);//窗体应用程序中常见
使用流程同上,参数解释如下:
object sender:把触发事件的整个对象封装成Object类型,传递对象的引用,如果触发了button的click事件,则sender为button
EventArgs e: 包含事件数据的类的基类,用于传递事件的细节
技术学习中,欢迎大家批评指正
码字不易,转载请注明来处