首页 > 其他 > 详细

委托与事件

时间:2014-02-15 02:23:38      阅读:476      评论:0      收藏:0      [点我收藏+]
1.    委托是一个定义签名的类型,即方法的返回值类型和参数列表类型。可以使用委托类型来声明一个变量,该变量可以引用与委托签名相同的所有方法。自定义的委托类编译后可以看到都继承了它继承了System.MulticastDelegate类
 
2.     委托定义返回值一般都是void,因为委托变量可以提供多个订阅者注册,如果定义了返回值,结果会是后面一个方法的返回值覆盖前面的,最终只返回一个值,而且发布者与订阅者是松耦合,发布者不关心谁订阅了它的事件,为什么订阅,更不关心返回值
 
3.    事件封装了委托类型的变量,在类的内部不管声明是public还是protected,它总是private,在类的外部注册"+="和注销"-="的访问限定符与你在声明事件时使用的访问符相同.如果事件只允许一个客户订阅,可以将时间定义成private,这样外部无法调用"+="订阅事件,然后实现一个供注册事件的公共方法,里面只有赋值操作.
 
4.    事件访问器类似于属性访问器,不同之处在于事件访问器被命名为 add 和 remove。在大多数情况下都不需要提供自定义的事件访问器。如果您在代码中没有提供自定义的事件访问器,编译器会自动添加事件访问器。
 
5.    事件的调用只能在定义事件的类内调用,但订阅/取消事件要在类外部
 
6.    在Delegate内部,维护了一个委托链表,链表上的每一个元素,为一个只包含一个目标方法的委托对象。而通过Delegate基类的GetInvocationList()静态方法,可以获得这个委托链表。随后我们遍历这个链表,通过链表中的每个委托对象来调用方法,这样就可以分别获得每个方法的返回值,而且可以避免由于异常导致后续函数无法调用的问题
 
7.    它是定义在Delegate基类中的DynamicInvoke()方法,通常用于调用委托方法

public object DynamicInvoke(params object[] args);

8.    委托的异步调用

通过调用GetInvocationList获取每个委托对象,然后调用委托对象的BeginInvoke方法

9.    EventHandler,.net定义好的委托,无法包含事件数据,因为EventArgs中没有存储数据的属性

 public delegate void EventHandler(object sender,EventArgs e)

 如果要使用带数据的事件使用下列委托

public delegate void EventHandler<TEventArgs>(
Object sender,
TEventArgs e
)
10. .Net FrameWork规范
  • 委托类型的名称都应该以EventHandler结束。
  • 委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型,一个 EventArgs类型(或继承自EventArgs)。
  • 事件的命名为 委托去掉 EventHandler之后剩余的部分。
  • 继承自EventArgs的类型应该以EventArgs结尾。

 

 

 

 

 

 

 

 

 

 

 

委托与事件

原文:http://www.cnblogs.com/phenix-yu/p/3549398.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!