首页 > 代码库 > C#委托与事件

C#委托与事件

  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结尾。

C#委托与事件