zoukankan      html  css  js  c++  java
  • 事件与委托的联系和区别

    -事件是一种特殊的委托的实例,或者说是受限制的委托,是委托一种特殊应用,在类的外部只能施加+=,-=操作符,二者本质上是一个东西。

    -event ActionHandler Tick; // 编译成创建一个私有的委托示例, 和施加在其上的add, remove方法. 

    -event只允许用add, remove方法来操作,这导致了它不允许在类的外部被直接触发,只能在类的内部适合的时机触发。委托可以在外部被触发,但是别这么用。

    -使用中,委托常用来表达回调,事件表达外发的接口。

    -委托和事件支持静态方法和成员方法, delegate(void * pthis, f_ptr), 支持静态返方法时, pthis传null.支持成员方法时, pthis传被通知的对象.

    -委托对象里的三个重要字段是, pthis, f_ptr, pnext, 也就是被通知对象引用, 函数指针/地址, 委托链表的下一个委托节点.

    1. 怎样定义委托类型?

    delegate + function signature // delegate相当于class关键字, function name相当于定义的委托类型.

    delegate void Action();

    2. 怎样定义委托实例? Action action;

    3. 怎样定义事件?

       先定义委托类型 delegate void ActionHandler(object sender, EventArgs args);

       再定义事件实例  event ActionHandler Tick;

    记忆的方法:

    delegate关键字类比于class关键字, 定义的是一种委托类型,然后再创建委托示例.

    创建委托实例时, 用event关键字来修饰就变成了创建一个事件. 也就是事件是一种特殊的委托.

        class MyClass
        {
            public delegate void CompletedEventHandler();
    public event CompletedEventHandler WorkCompleted; public CompletedEventHandler WorkCompletedDelegate; public void Fire() { if (this.WorkCompleted != null) { this.WorkCompleted(); } if (this.WorkCompletedDelegate != null) { this.WorkCompletedDelegate(); } } } class Program { static void TestEvent() { Console.WriteLine("test event"); } static void TestDelegate() { Console.WriteLine("test delegate"); } static void Main(string[] args) { MyClass myObject = new MyClass(); myObject.WorkCompletedDelegate += TestDelegate; myObject.WorkCompleted += TestEvent; myObject.Fire(); myObject.WorkCompletedDelegate(); // myObject.WorkCompleted(); // this line will raise compiling error }
  • 相关阅读:
    LeetCode 345. Reverse Vowels of a String 题解
    LeetCode 344. Reverse String 题解
    LeetCode 27. Remove Element 题解
    LeetCode 61. Rotate List 题解
    LeetCode 19.Remove Nth Node From End of List 题解
    Android耗电量
    Android 使用adb查看和修改电池信息
    Android AOP AspectJ 插桩
    Flask相关用法
    Monkey日志信息的11种Event percentage
  • 原文地址:https://www.cnblogs.com/dirichlet/p/3247020.html
Copyright © 2011-2022 走看看