zoukankan      html  css  js  c++  java
  • 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结尾。
  • 相关阅读:
    string的sizeof
    计算程序运行时间
    sleep所在头文件
    Mysql复制表结构、表数据
    UIView属性
    UITextView
    UITextField属性
    UISwitch属性
    UISlide属性
    UISegment属性
  • 原文地址:https://www.cnblogs.com/phenixyu/p/3967170.html
Copyright © 2011-2022 走看看