3 回答

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安全的(通過檢查)又是線程安全的(僅通過讀取引用一次)。

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á)式主體的成員,
- 3 回答
- 0 關(guān)注
- 519 瀏覽
添加回答
舉報