顯示實現事件訂閱與註銷

當咱們定義一個事件的時候,默認會多出兩個方法,分別是添加,和刪除的方法spa

譬如code

public event EventHander myEvent  //我定義了這麼一個事件

//那麼實際上IL中會多出2個方法,大概是下面這樣的

private event EventHander myEvent;// 原來的public 變爲private

public void add_myEvent(EventHander value){
    myEvent = (EventHander)Delegate.Combine(myEvent,value)
}

public void remove_myEvent(EventHander value){
    myEvent = (EventHander)Delegate.Remove(myEvent,value)
}

實際當咱們在其餘調用寫出myEvent+=……的時候,並無去真正訪問了myEvent,由於咱們看到實際的代碼已經對象

變成了私有的,實際上調用的是add_myEvent方法。blog

雖然CLR儘可能實現了同步,可是仍是有些問題的,這種狀況咱們能夠本身去實現add 與remove方法,本身控制鎖定事件

private event EventHander _myEvent;//本身定義一個私有的事件

private readonly object obj = new object();//定義個對象用來鎖定

Public EventHander myEvent
{
   add{
       lock(obj ){
          _myEvent+=value;
       }
   }
   remove{
      lock(obj){
           _myEvent-=value;
      }
   }
}
    
相關文章
相關標籤/搜索