核心歸納
核心賞析
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都用上就浪費了很多~空間