加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

也谈事件(Event)

发布时间:2020-12-16 09:07:35 所属栏目:asp.Net 来源:网络整理
导读:最近园子里发表了一些讨论“事件(Event)”的文章,我也来凑个热闹,谈谈我对事件的一些粗浅的认识。本文不谈设计模式(观察者模式),只从运行时的角度来分析事件这个对象到底是个什么东西,它有那么神秘吗?为了更好的分析事件,本文将会编写一些例子来模

最近园子里发表了一些讨论“事件(Event)”的文章,我也来凑个热闹,谈谈我对事件的一些粗浅的认识。本文不谈设计模式(观察者模式),只从运行时的角度来分析事件这个对象到底是个什么东西,它有那么神秘吗?为了更好的分析事件,本文将会编写一些例子来模拟事件的订阅机制。本文对事件的分析可以概括为下面三句话:

  • 事件本质上是一个MulticastDelegate对象;
  • MulticastDelegate对象是多个Delegate对象的链表;
  • Delegate = Object + MethodInfo,委托的执行最终通过反射来完成

一、Delegate = Object + MethodInfo

其实你完全可以通过Reflector这样的工具来看Delegate类型是如何定义的。在这里,我们只关注Delegate本质的东西,即Delegate最终是如果执行的。为此,我创建了下面一个简单的MyDelegate类型来模拟Delegate。

   1: public class MyDelegate
   3:? 
   5:     public MethodInfo Method { get; private set; }       
   7:     public MyDelegate(object target,MethodInfo method)
   9:         this.Target = target;
  11:     }      
  13:     virtual void Invoke(params object[] args)
  15:         this.Method.Invoke(this.Target,args);           
  17: }

从上面的定义可以看到,MyDelegate只有两个属性:Object类型的Target和MethodInfo类型的Method。委托的执行通过需方法Invoke完成,具体来说,最终的执行通过反射的方式调用Method的Invoke方法完成。

二、MulticastDelegate对象多个Delegate对象的链表

其实我们平时讲的委托,并不是一个单个的Delegate对象,实际上是一个委托链,这样一个委托链通过MulticastDelegate定义。由于定义也相对复杂,我们同样通过定义模拟类型来反映其本质的东西。为此,我创建了如下一个MyMulticastDelegate类型。

   2: {
   4:? 
   7:     { }
   9:     override   10:     {
  12:         if (null != Next)
  14:             this.Next.Invoke(args);
  16:     }
class MyEventHandler : MyMulticastDelegate
void Fire(object sender,EventArgs args)
  10:     }
  12:     static MyEventHandler operator +(MyEventHandler current,MyEventHandler next)
  14:         null == current)
  16:             return next;
  18:? 
  20:         while (null != terminator.Next)
  22:             terminator = terminator.Next;
  24:? 
  26:         return current;
  28:? 
  30:     {
  32:     }
class Button
public MyEventHandler Click { get; set; }
   6:     public Button(string id)
   8:         this.Id = id;
  10:? 
  12:     {
  14:         {
  17:     }
  20:     {
  22:     }
class Foo
   5:         Button btn = sender as Button;
   7:         {
   9:         }
class Program
   4:     {
   6:         var foo = new Foo();
   8:         btn1.Click += new EventHandler(foo.DoSomethingOnceClick);
  14:     } 
Click Button1
Click Button1
Click Button1

本文提供的例子,你可以通过这里下载,关于事件相关的内容,我还有一篇相关的文章《如何编写没有Try/Catch的程序》,仅供参考。

作者:Artech
出处:http://artech.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读