2012-04-02 230 views
3

我想僅調用一次事件處理程序,然後將其分離。我試着寫:第一次調用處理程序時分離處理程序

EventHandler handler = (s, e) => 
{ 
    // Do something 
    // 
    // blabla 

    // Detach the handler 
    SizeChanged -= handler; 
}; 
SizeChanged += handler; 

但是上線SizeChanged -= handler我得到這個錯誤

Use of unassigned local variable 'handler' 

你對我應該如何進行idead?我想過使用布爾標誌,但只有在找不到分離處理程序的方法時纔會這樣做。

回答

3

這是因爲它確實尚未分配。嘗試製作一個命名方法,以便預先知道該符號。

private void OnEvent(object sender, EventArgs e) 
{ 
    // Do something 

    AnEvent -= OnEvent; 
} 

private void RegisterOnce() 
{ 
    AnEvent += OnEvent; 
} 

我也建議只detatch後運行DoSmething代碼,並實現一些鎖定機制,如果你有multithrading,以防止從多個線程調用在完全相同的活動時間內,沒有時間來detatch並因此全部運行。

6

C#編譯器將首先創建您在將結果分配給變量之前寫入的lambda表達式。所以當lambda被定義時,處理程序沒有值。

它的工作原理是,如果您之前爲EventHandler分配了一個null值。

因爲它是一個封閉和局部變量在封閉的拍攝,在呼叫處理程序的時候會產生正確的值,它會工作:

 EventHandler handler=null; 

     handler = (s, e) => 
     { 
      // Do something 
      SizeChanged -= handler; 
     }; 
     SizeChanged += handler; 

給所有的人downvoting:它贏得了不會導致NullReferenceException。 handler是一個在閉包中捕獲的局部變量,所以當它在包含閉包的方法中發生變化時,lambda中的handler的值將會改變。我在我的電腦上測試了它,它完美地工作。

+1

如果你這樣做,你會在你的回調中產生空參考異常... – 2012-04-02 12:37:57

+2

不,試試吧。處理程序在關閉中捕獲。 – aKzenT 2012-04-02 12:38:46

+2

嘿,在你嘗試過之前不要投票給我!閱讀關於如何關閉工作...... – aKzenT 2012-04-02 12:39:29