zoukankan      html  css  js  c++  java
  • Events

    event,a type that defines an event member allows the type(or instances of the type) to notify other objects that something special has happiend.

    事件:定义事件成员的类型允许类型(或者类型的实例)在某些特定事情发生时通知其它对象。事件是基于委托机制上,委托是提供一种安全调用回调方法的类型。

    一、定义事件

    1、保存事件接受者所需的全部信息,类型继承自System.EventArgs,FCL定义如下:

    [Serializable]
    public class EvenArgs
    {
       public static readonly EventArgs Empty = new EventArgs();
       public EventArgs() { }
    }

    2、指定事件触发时被调用的方法原型,如果定义的事件没有需要传递给事件接受的附加信息信息,可直接使用FCL中的System.EventHandler的定义如下:

    public delegate void EventHandler(object sender, EventArgs e);

    3、定义事件成员

    public event EventHandler SmapleEvent;

    4、定义负责通知事件的登记对象

      protected virtual void NotifySubscriber(EventHandler e)
        {
            if (SmapleEvent!= null)
            {
                SmapleEvent(this, e);
            }
        }

    5、感应外部操作触发事件

     public void FireEvent(EventHandler e)
        {
            NotifySubscriber(e);
        }
    6、侦听事件
    注册:     sampleEvent += new EventHandler(SubscriberMethod);   
    注销:     smapleEvent –= new EventHandler(subscriberMethod);
    private void subscriberMethod( object sender, EventArgs e) 
     {
            Console.WriteLine(" Process the message in its disires");
    }

    二、事件的真相

    程序员眼中的event:

    public event EventHandler sampleEvent;

    编译器眼中的event:

    private EventHandler sampleEvent =null;
    
    [MethodImplAttribute(MethodImplOptions.Synchronized)]
    public  void add_*(EventHandler handler)
    {
       sampleEvent = (EventHandler)Delegate.Combine(sampleEvent, handler);
    }
    
    [MethodImplAttribute(MethodImplOptions.Synchronized)]
    public  void remove_*(EventHandler handler)
    {
       sampleEvent = (EventHandler)Delegate.Remove(sampleEvent, handler);
    }
    注意:
    a.源代码中公有的事件,编译器将其转化为私有的委托字段。
    b.通过combine 和 Remove 方法操作委托链。
    c.combine 和 Remove方法应用MethodImplAttribute特性,使其同步安全,多个侦听者同时登记或注销事件,也不会损坏委托链。
     
    三、显式控制事件注册
    class MailManage
    {
        public class MailMsgEventArgs : EventArgs
        { }
    
        public delegate void MailMsgEventHandler(object sender, MailMsgEventArgs args);
        //显式定义委托链表字段
        private MailMsgEventHandler mailMsgEventHandlerDelegate;
        //显式定义事件及其访问器方法
        public event MailMsgEventHandler MailMsg 
        {
            add 
            {
                mailMsgEventHandlerDelegate = (MailMsgEventHandler)Delegate.Combine(mailMsgEventHandlerDelegate, value);
            }
            remove
            {
                mailMsgEventHandlerDelegate = (MailMsgEventHandler)Delegate.Remove(mailMsgEventHandlerDelegate, value);
            }
        }
    
        protected virtual void OnMailMsg(MailMsgEventArgs e)
        {  
            //判断委托字段而非事件名称
            if (mailMsgEventHandlerDelegate != null)
            {
                mailMsgEventHandlerDelegate(this, e);
            }
        }
    
        public void FireEvent(MailMsgEventArgs e)
        {
            OnMailMsg(e);
        }
    }
      参照:.net框架程序设计
  • 相关阅读:
    字符、字符串和文本处理
    接口
    泛型
    事件
    Expression表达式树 案例
    栈帧
    属性
    方法
    常量和字段
    Dynamic
  • 原文地址:https://www.cnblogs.com/spirit/p/1557623.html
Copyright © 2011-2022 走看看