2011-02-28 68 views
10

基本上,我已經看到了這個使用的所有經常:爲什麼在調用它之前爲事件分配一個處理程序?

public event MyEventHandler MyEvent; 

    private void SomeFunction() 
    { 
     MyEventHandler handler = this.MyEvent; 

     if (handler != null) 
     { 
      handler(this, new MyEventArgs()); 
     } 
    } 

當可以很容易地完成像這樣:

public event MyEventHandler MyEvent; 

    private void SomeFunction() 
    { 
     if (MyEvent != null) 
     { 
      MyEvent(this, new MyEventArgs()); 
     } 
    } 

所以,我失去的東西嗎?是否有一些人將事件分配給處理程序,然後提升處理程序而不是事件本身?這只是「最佳做法」嗎?

回答

10

分配給本地變量保證,如果事件獲取if和實際調用之間註銷,調用列表將不爲空(因爲變量都會有原始調用列表的副本)。

這很容易發生在多線程代碼中,在檢查null和觸發事件之間可能會被另一個線程取消註冊。

請參閱this SO問題和答案。

2

線程安全。

如果在檢查MyEvent是否爲空並且您啓動MyEvent時另一個線程出現並取消訂閱該事件,會發生什麼情況?

相關問題