《CLR via C#》讀書筆記---11事件

核心歸納

這裏寫圖片描述


核心賞析

CLR的事件模型~~

① EventArgs是參數,定義通知其他類型時附帶的信息

    // 摘要: 
    //     System.EventArgs 是包含事件數據的類的基類。
    [Serializable]
    [ComVisible(true)]
    public class EventArgs
    {
        // 摘要: 
        //     表示沒有事件數據的事件。
        public static readonly EventArgs Empty;

        // 摘要: 
        //     初始化 System.EventArgs 類的新實例。
        public EventArgs();
    }

使用呢,繼承EventArgs,並以EventArgs結尾即可

這裏寫圖片描述

自定義一個~

     class TravelEventArgs : EventArgs
     {
        public string Topic { get; set; }
        public DateTime PlayTime { get; set; }
        public string Description { get; set; }  
     }

② 定義一個FCL已封裝好的事件EventHandler,當在要調用執行通知行爲的時候

if (null != eventHandler)
{
    //LocationB
    eventHandler(this,info);
}

我們會在通知的時候,看事件對象是否爲null,會做一個判斷,然後在LocationB這裏執行通知

問題是如果在LocationB,外部代碼將eventHandler賦值爲null,找不到相關引用怎麼辦?這就是競態調用
因此,在判斷爲null前預先存一下引用

EventHandler<TravelEventArgs> traveHandler = eventHandler;

但是局部變量這樣轉存的方式,編譯器會開啓優化,真實的編譯後是沒有這行怎麼辦?

EventHandler<TravelEventArgs> traveHandler = Volatile.Read(ref eventHandler);

使用Volatile,強制編譯器不使用緩存,怎麼寫的怎麼執行~
Volatile是.Net 4.5後有的


事件的實現是內部維護一個字段,因此也意味着定義一個EventHandler時也是定義了一個字段
FCL在Control中封裝了約70多個EventHandler,那繼承Control意味着派生類如果沒有把這些EventHandler都用上就浪費了很多~空間
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章