青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

xiaoguozi's Blog
Pay it forword - 我并不覺的自豪,我所嘗試的事情都失敗了······習慣原本生活的人不容易改變,就算現狀很糟,他們也很難改變,在過程中,他們還是放棄了······他們一放棄,大家就都是輸家······讓愛傳出去,很困難,也無法預料,人們需要更細心的觀察別人,要隨時注意才能保護別人,因為他們未必知道自己要什么·····
CLR事件機制建立在委托機制上
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);
        }
    }
以上是一個事件類型定義,簡單步驟:
1.定義一個類型,保存所有傳遞參數。
.net框架規定所有的信息類型繼承于EventArgs,類型名稱以EventArgs結束,EventArgs原型如下:
[Serializable]
public class EventArgs
{
    public static readonly EventArgs Empty = new EventArgs();
    public EventArgs(){};
}
只有一個靜態的Empty成員,因為事件中有些不需要額外的參數信息,所以只要提供EventArgs.Empty,不需要在構造新的對象
2.定義一個委托類型,指定事件觸發時調用的函數原型
public delegate void MailEventHandler(Object sender, MailEventArgs e);
如果事件中并沒有額外的傳遞信息,則可以使用System.EventHandler,原型為
public delegate void EventHandler(Object sender,EventArgs e);
3.定義一個事件成員
public event MailEventHandler MailMsg;
4.定義受保護的虛方法,通知事件登記對象
protected virtual void OnMailMsg(MailEventArgs e);
5.定義驅動事件方法
public virtual void SimulateArrivingMsg(String from, String to, String subject, String body);

深入理解事件
當編譯器遇到
public event MailEventHandler MailMsg;
會產生3個構造,一個私有委托類型,及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內_prev字段可以將添加的注冊對象保存

偵聽事件
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;
        }
    }

注意,當一個對象仍然登記有另外一個對象的事件,該對象就不可能對垃圾回收,如果我們類實現了IDisposable接口,那我們應該在
Dispose理注銷所有登記事件

顯示控制事件注冊
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;定義

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

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 框架設計一個example,如果設計該種事件類型,其中給出了EventHandlerSet的實現,
.net框架中也有類似的事件 EventHandlerList,但是訪問效率和線程同步有缺陷,所以有需要我們自己提供
EventHandlerSet實現.詳情請參考microsoft .net 框架設計

posted on 2010-09-30 14:17 小果子 閱讀(449) 評論(0)  編輯 收藏 引用 所屬分類: .Net

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲精品国产精品乱码不99按摩 | 欧美日韩精品一区视频| 国产精品一二三视频| 亚洲综合清纯丝袜自拍| 亚洲视频专区在线| 国产精品永久在线| 久久人人爽国产| 欧美mv日韩mv国产网站app| 亚洲片在线观看| 一区二区三区四区国产精品| 国产精品免费看片| 久久精品卡一| 欧美不卡高清| 亚洲系列中文字幕| 欧美一区二区三区免费视| 韩日欧美一区二区三区| 欧美护士18xxxxhd| 欧美日韩一区二区国产| 久久精品中文| 欧美紧缚bdsm在线视频| 性色av一区二区三区| 久久久久九九九| 亚洲一二三区精品| 久久国产成人| 亚洲一区三区电影在线观看| 久久狠狠亚洲综合| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲人成在线观看一区二区| 日韩亚洲精品在线| 国产一区二区三区高清| 亚洲第一伊人| 国产伦精品一区二区三区高清版| 麻豆精品一区二区综合av| 欧美激情在线免费观看| 久久久另类综合| 欧美日韩国产小视频| 久久精品夜夜夜夜久久| 欧美精品999| 久久久久这里只有精品| 欧美日韩一区二区三区在线看 | 欧美在线观看网址综合| 欧美本精品男人aⅴ天堂| 午夜久久黄色| 欧美精品日韩www.p站| 久久久国产精彩视频美女艺术照福利 | 欧美中文字幕视频| 欧美寡妇偷汉性猛交| 久久久久久9999| 欧美无乱码久久久免费午夜一区 | 一级日韩一区在线观看| 久久福利精品| 午夜精品久久久| 欧美猛交免费看| 欧美成人久久| 国产综合亚洲精品一区二| 日韩午夜在线| 99re视频这里只有精品| 久久久亚洲综合| 久久福利电影| 国产精品久久久一区二区| 亚洲精品久久久久久久久久久久久| 韩国三级在线一区| 欧美一级大片在线免费观看| 亚洲欧美第一页| 欧美午夜片在线观看| 日韩视频一区二区三区在线播放| 91久久精品国产91久久| 久久免费视频在线| 免费成人性网站| 在线观看福利一区| 久久国产精品99国产精| 久久精品综合一区| 国精产品99永久一区一区| 午夜久久久久久| 欧美制服丝袜第一页| 国产日产精品一区二区三区四区的观看方式 | 欧美日本一区二区三区| 亚洲国产综合视频在线观看| 亚洲国产精品成人久久综合一区| 欧美专区中文字幕| 久久久99久久精品女同性| 国产性猛交xxxx免费看久久| 欧美一级片久久久久久久| 久久精品人人| 伊大人香蕉综合8在线视| 久久一区二区三区四区| 亚洲欧洲综合另类| 亚洲欧美日韩国产另类专区| 国产麻豆精品视频| 欧美专区一区二区三区| 欧美成人官网二区| 一本不卡影院| 国产精品资源| 久久青青草综合| 亚洲承认在线| 亚洲宅男天堂在线观看无病毒| 国产精品久久久久久久久动漫| 午夜精品久久久久久久99樱桃| 久久久久免费视频| 91久久国产综合久久| 欧美午夜不卡| 久久免费黄色| 一区二区三区四区五区视频| 久久天天躁夜夜躁狠狠躁2022| 亚洲免费观看视频| 国产欧美一区二区白浆黑人| 美日韩精品视频| 亚洲一区二区三区免费在线观看| 免费精品99久久国产综合精品| 一区二区激情| 精品白丝av| 国产精品久久网站| 欧美成人精品影院| 亚洲免费在线精品一区| 亚洲国产日韩美| 久久国产精品99国产精| 日韩一区二区电影网| 国产专区一区| 国产精品久久久久久久久久ktv| 久久久久国产成人精品亚洲午夜| 一区二区三区四区国产精品| 欧美成人免费va影院高清| 性色一区二区| 亚洲无线一线二线三线区别av| 亚洲第一色中文字幕| 国产伦精品一区二区| 欧美日韩国产一区精品一区| 另类激情亚洲| 久久疯狂做爰流白浆xx| 亚洲尤物在线视频观看| 一区二区高清视频在线观看| 欧美高清你懂得| 久久婷婷人人澡人人喊人人爽| 欧美在线日韩在线| 亚洲天堂av高清| 在线视频你懂得一区| 亚洲精品一区二区网址 | 欧美日韩国产限制| 欧美成年人网站| 久久夜色撩人精品| 久久精品中文字幕免费mv| 亚洲欧美久久久| 亚洲综合精品自拍| 亚洲一区二区欧美日韩| 中文日韩在线视频| 一区二区三区成人| 在线中文字幕一区| 亚洲一区国产一区| 午夜精品网站| 欧美一二三区在线观看| 欧美一区二区三区视频在线| 久久国产精品高清| 久久久久国产成人精品亚洲午夜| 久久久国产成人精品| 久久久青草婷婷精品综合日韩 | 欧美一区三区三区高中清蜜桃| 亚洲欧美视频在线| 欧美一二三视频| 久久亚洲国产成人| 麻豆9191精品国产| 欧美久久九九| 国产精品高潮呻吟久久av黑人| 国产精品久久久一区麻豆最新章节| 国产精品羞羞答答| 激情成人av在线| 亚洲精品美女在线观看播放| 夜久久久久久| 亚洲欧美日韩在线高清直播| 久久精品一区二区三区不卡| 免费日本视频一区| 亚洲日本中文字幕免费在线不卡| 一区二区三区精品在线| 午夜天堂精品久久久久| 理论片一区二区在线| 欧美日韩另类在线| 国产色爱av资源综合区| 亚洲国产精品精华液网站| 亚洲一区中文| 久久网站免费| 亚洲伦理在线| 久久国产主播精品| 欧美日韩免费观看一区二区三区| 国产目拍亚洲精品99久久精品| 激情综合色丁香一区二区| 99在线观看免费视频精品观看| 欧美在线视屏| 亚洲国产成人精品女人久久久| 亚洲欧美精品在线| 欧美大片在线观看一区二区| 国产伦精品一区二区三| 亚洲精品四区| 久久先锋影音av| 一本色道久久综合一区| 久久久欧美一区二区| 国产精品户外野外| 亚洲欧洲日本国产| 久久噜噜噜精品国产亚洲综合| 亚洲国产欧美一区| 久久精品亚洲乱码伦伦中文| 国产精品国产三级国产专区53|