第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在事件處理程序中使用空值檢查

在事件處理程序中使用空值檢查

C#
三國紛爭 2019-10-17 15:47:58
在檢查事件處理程序是否為null時,這是否基于每個線程進(jìn)行?確保有人正在聽事件是這樣完成的:EventSeven += new DivBySevenHandler(dbsl.ShowOnScreen);如果我按照此模式在上面檢查空值的位置添加代碼,那么為什么我需要進(jìn)行空值檢查(從此站點獲取的代碼)。我想念什么?此外,事件和GC的規(guī)則是什么?
查看完整描述

3 回答

?
慕碼人8056858

TA貢獻(xiàn)1803條經(jīng)驗 獲得超6個贊

問題是,如果沒有人訂閱該事件,則該事件為null。而且您不能針對null調(diào)用。三種方法讓人想到:


檢查是否為空(請參見下文)

添加“不執(zhí)行任何操作”處理程序: public event EventHandler MyEvent = delegate {};

使用擴(kuò)展方法(見下文)

為了確保線程安全,在檢查null時,理論上必須首先捕獲委托引用(以防在檢查和調(diào)用之間更改):


protected virtual void OnMyEvent() {

    EventHandler handler = MyEvent;

    if(handler != null) handler(this, EventArgs.Empty);

}

擴(kuò)展方法具有不尋常的屬性,可以在空實例上調(diào)用。


    public static void SafeInvoke(this EventHandler handler, object sender)

    {

        if (handler != null) handler(sender, EventArgs.Empty);

    }

    public static void SafeInvoke<T>(this EventHandler<T> handler,

        object sender, T args) where T : EventArgs

    {

        if (handler != null) handler(sender, args);

    }

那么您可以致電:


MyEvent.SafeInvoke(this);

它既是null安全的(通過檢查)又是線程安全的(僅通過讀取引用一次)。


查看完整回答
反對 回復(fù) 2019-10-17
?
瀟湘沐

TA貢獻(xiàn)1816條經(jīng)驗 獲得超6個贊

我想附加一些有關(guān)C#6.0語法的簡短信息:


現(xiàn)在可以替換為:


var handler = EventSeven;


if (handler != null)

    handler.Invoke(this, EventArgs.Empty);

有了這個:


handler?.Invoke(this, EventArgs.Empty);

將其與表達(dá)式成員結(jié)合在一起,可以縮短以下代碼:

protected virtual void OnMyEvent()

{

    EventHandler handler = MyEvent;

    handler?.Invoke(this, EventArgs.Empty);

}

下降到一個班輪:


protected virtual void OnMyEvent() => MyEvent?.Invoke(this, EventArgs.Empty);

有關(guān)空條件運算符的更多信息,請參見MSDN。有關(guān)表達(dá)式主體的成員,


查看完整回答
反對 回復(fù) 2019-10-17
  • 3 回答
  • 0 關(guān)注
  • 519 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號