• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            xiaoguozi's Blog
            Pay it forword - 我并不覺的自豪,我所嘗試的事情都失敗了······習(xí)慣原本生活的人不容易改變,就算現(xiàn)狀很糟,他們也很難改變,在過程中,他們還是放棄了······他們一放棄,大家就都是輸家······讓愛傳出去,很困難,也無法預(yù)料,人們需要更細(xì)心的觀察別人,要隨時(shí)注意才能保護(hù)別人,因?yàn)樗麄兾幢刂雷约阂裁础ぁぁぁぁ?/span>
            CLR事件機(jī)制建立在委托機(jī)制上
            class MailManager
                {
                    
            public class MailEventArgs : EventArgs
                    {
                        
            public MailEventArgs(
                            String from,
                            String to,
                            String subject,
                            String body)
                        {
                            
            this.from = from;
                            
            this.to = to;
                            
            this.subject = subject;
                            
            this.body = body;
                        }
                        
            public readonly String from, to, subject, body;
                    }
                    
            public delegate void MailEventHandler(Object sender, MailEventArgs e);
                    
            public event MailEventHandler MailMsg;
                    
            protected virtual void OnMailMsg(MailEventArgs e)
                    {
                        
            if (MailMsg != null)
                        {
                            MailMsg(
            this, e);
                        }
                    }
                    
            public virtual void SimulateArrivingMsg(String from, String to, String subject, String body)
                    {
                        MailEventArgs e 
            = new MailEventArgs(from, to, subject, body);
                        OnMailMsg(e);
                    }
                }
            以上是一個(gè)事件類型定義,簡單步驟:
            1.定義一個(gè)類型,保存所有傳遞參數(shù)。
            .net框架規(guī)定所有的信息類型繼承于EventArgs,類型名稱以EventArgs結(jié)束,EventArgs原型如下:
            [Serializable]
            public class EventArgs
            {
                public static readonly EventArgs Empty = new EventArgs();
                public EventArgs(){};
            }
            只有一個(gè)靜態(tài)的Empty成員,因?yàn)槭录杏行┎恍枰~外的參數(shù)信息,所以只要提供EventArgs.Empty,不需要在構(gòu)造新的對(duì)象
            2.定義一個(gè)委托類型,指定事件觸發(fā)時(shí)調(diào)用的函數(shù)原型
            public delegate void MailEventHandler(Object sender, MailEventArgs e);
            如果事件中并沒有額外的傳遞信息,則可以使用System.EventHandler,原型為
            public delegate void EventHandler(Object sender,EventArgs e);
            3.定義一個(gè)事件成員
            public event MailEventHandler MailMsg;
            4.定義受保護(hù)的虛方法,通知事件登記對(duì)象
            protected virtual void OnMailMsg(MailEventArgs e);
            5.定義驅(qū)動(dòng)事件方法
            public virtual void SimulateArrivingMsg(String from, String to, String subject, String body);

            深入理解事件
            當(dāng)編譯器遇到
            public event MailEventHandler MailMsg;
            會(huì)產(chǎn)生3個(gè)構(gòu)造,一個(gè)私有委托類型,及add和remove方法
            private MailEventHandler MailMsg;
            [MethodImplAttribute(MethodImplOptions.Synchronized)]
            public virtual void add_MailMsg(MailEventHandler handler)
            {
                 MailMsg = (MailEventHandler)Delegate.Combine(MailMsg, handler);
            }
            [MethodImplAttribute(MethodImplOptions.Synchronized)]
            public virtual void remove_MailMsg(MailEventHandler handler)
            {
                 MailMsg = (MailEventHandler)Delegate.Remove(MailMsg, handler);
            }
            通過MailMsg內(nèi)_prev字段可以將添加的注冊(cè)對(duì)象保存

            偵聽事件
            class Fax
                {
                    public Fax(MailManager mm)
                    {
                        mm.MailMsg += new MailManager.MailEventHandler(FaxMsg);
                    }
                    private void FaxMsg(Object sender, MailManager.MailEventArgs e)
                    {

                    }
                    public void UnRegister(MailManager mm)
                    {
                        MailManager.MailEventHandler callback = new MailManager.MailEventHandler(FaxMsg);
                        mm.MailMsg -= callback;
                    }
                }

            注意,當(dāng)一個(gè)對(duì)象仍然登記有另外一個(gè)對(duì)象的事件,該對(duì)象就不可能對(duì)垃圾回收,如果我們類實(shí)現(xiàn)了IDisposable接口,那我們應(yīng)該在
            Dispose理注銷所有登記事件

            顯示控制事件注冊(cè)
            private MailEventHandler mailMsgEventHandlerDelegate;
                    public event MailEventHandler MailMsg
                    {
                        add
                        {
                            mailMsgEventHandlerDelegate =(MailEventHandler)Delegate.Combine(mailMsgEventHandlerDelegate, value);
                        }
                        remove
                        {
                            mailMsgEventHandlerDelegate = (MailEventHandler)Delegate.Remove(mailMsgEventHandlerDelegate, value);
                        }
                    }
                    protected virtual void OnMailMsg(MailEventArgs e)
                    {
                        if (MailMsg != null)
                        {
                            mailMsgEventHandlerDelegate(this, e);
                        }
                    }

            來代替
            public event MailEventHandler MailMsg;定義

            當(dāng)一個(gè)類型中含有多個(gè)事件時(shí),由于每個(gè)事件事例聲明都將產(chǎn)生委托字段,所以推薦
            不要提供公共的事件成員變量,使用事件訪問器替換這些變量

            class EventHandlerSet:IDisposable
                {
                    private Hashtable events = new Hashtable();
                    public virtual Delegate this[Object eventKey]
                    {
                        get
                        {
                            return (Delegate)events[eventKey];
                        }
                        set
                        {
                            events[eventKey] = value;
                        }
                    }
                    public virtual void AddHandler(Object eventKey,Delegate handler)
                    {
                        events[eventKey] = Delegate.Combine((Delegate)events[eventKey], handler);
                    }
                    public virtual void RevHandler(Object eventKey, Delegate handler)
                    {
                        events[eventKey] = Delegate.Remove((Delegate)events[eventKey], handler);
                    }
                    public virtual void Fire(Object eventKey, Object sender, EventArgs e)
                    {
                        Delegate d = (Delegate)events[eventKey];
                        if (d != null)
                            d.DynamicInvoke(new Object[]{sender,e});
                    }
                    public void Dispose()
                    {
                        events = null;
                    }
                    public static EventHandlerSet Synchronized(EventHandlerSet eventHandlerSet)
                    {
                        if (eventHandlerSet == null)
                            throw new ArgumentNullException("eventHandlerSet");
                        return new SynchronizedEventHandlerSet(eventHandlerSet);
                    }
                    public class SynchronizedEventHandlerSet : EventHandlerSet
                    {
                        private EventHandlerSet eventHandlerSet;
                        public SynchronizedEventHandlerSet(EventHandlerSet eventHandlerSet)
                        {
                            this.eventHandlerSet = eventHandlerSet;
                            Dispose();
                        }
                        public override Delegate this[object eventKey]
                        {
                            [MethodImpl(MethodImplOptions.Synchronized)]
                            get
                            {
                                return eventHandlerSet[eventKey];
                            }
                            set
                            {
                                eventHandlerSet[eventKey] = value;
                            }
                        }
                        [MethodImpl(MethodImplOptions.Synchronized)]
                        public override void AddHandler(object eventKey, Delegate handler)
                        {
                            eventHandlerSet.AddHandler(eventKey, handler);
                        }
                        [MethodImpl(MethodImplOptions.Synchronized)]
                        public override void RevHandler(object eventKey, Delegate handler)
                        {
                            eventHandlerSet.RevHandler(eventKey, handler);
                        }
                        [MethodImpl(MethodImplOptions.Synchronized)]
                        public override void Fire(object eventKey, object sender, EventArgs e)
                        {
                            eventHandlerSet.Fire(eventKey, sender, e);
                        }
                    }
                }
                class TypeWithLotsEvents
                {
                    protected EventHandlerSet eventSet = EventHandlerSet.Synchronized(new EventHandlerSet());
                    protected static readonly Object fooEventKey = new Object();
                    public class FooEventArgs : EventArgs { };
                    public delegate void FooEventHandler(Object sender, FooEventArgs e);
                    public event FooEventHandler Foo
                    {
                        add
                        {
                            eventSet.AddHandler(fooEventKey, value);
                        }
                        remove
                        {
                            eventSet.AddHandler(fooEventKey, value);
                        }
                    }
                    protected virtual void OnFoo(FooEventArgs e)
                    {
                        eventSet.Fire(fooEventKey, this, e);
                    }
                    public void SimulateFoo()
                    {
                        OnFoo(new FooEventArgs());
                    }

                }
            以上是microsoft .net 框架設(shè)計(jì)一個(gè)example,如果設(shè)計(jì)該種事件類型,其中給出了EventHandlerSet的實(shí)現(xiàn),
            .net框架中也有類似的事件 EventHandlerList,但是訪問效率和線程同步有缺陷,所以有需要我們自己提供
            EventHandlerSet實(shí)現(xiàn).詳情請(qǐng)參考microsoft .net 框架設(shè)計(jì)

            posted on 2010-09-30 14:17 小果子 閱讀(437) 評(píng)論(0)  編輯 收藏 引用 所屬分類: .Net
            久久精品国产亚洲欧美| 午夜精品久久久久久中宇| 一本大道加勒比久久综合| 国产精品一区二区久久精品涩爱| 久久久久久无码Av成人影院 | 无码国内精品久久综合88| 一本久久a久久精品亚洲| 欧美久久天天综合香蕉伊| 国产成人精品久久一区二区三区av | 久久国产亚洲精品无码| 精品久久人人爽天天玩人人妻| 精品午夜久久福利大片| 国产精品久久久久久久久软件| 国产成年无码久久久久毛片| 欧洲成人午夜精品无码区久久| 亚洲精品乱码久久久久久蜜桃不卡 | 狠狠色丁香婷婷久久综合五月 | 久久无码人妻一区二区三区| 国产午夜免费高清久久影院| 久久99热这里只有精品国产| 国内精品久久久久伊人av| 亚洲一级Av无码毛片久久精品| 久久人人爽人人爽人人片av麻烦 | 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久er国产精品免费观看8| av无码久久久久久不卡网站| 亚洲精品白浆高清久久久久久| 久久人人爽人人爽人人av东京热 | 久久久久久毛片免费播放| 一本色道久久88精品综合 | 一级做a爰片久久毛片16| 久久九九亚洲精品| 精品人妻伦一二三区久久| 久久成人国产精品二三区| 狠狠色婷婷久久一区二区三区| 午夜精品久久久久久毛片| 亚洲国产精品无码久久| 久久久久成人精品无码中文字幕| 性欧美大战久久久久久久久| 99久久无色码中文字幕| 久久久久99精品成人片|