2012-05-24 59 views
6

可能重複:總是可以添加一個空的事件處理程序嗎?

public event Action handler; 
… 
// some method: 
if(handler != null) handler(); 

是否有分配一個空的任何缺點:
Is there a downside to adding an anonymous empty delegate on event declaration?

以下圖案使用的事件處理程序(在C#)時是很常見代表參加此活動?這將節省在任何地方的事件被觸發的if !=null條件。當然,這隻適用於當我們不能保證事件總是被分配一個適當的代表時。

public event Action handler; 
… 
// in constructor: 
handler +=()=>{}; 
… 
// some method: 
handler(); 

當然,雖然有輕微的性能下降,但它使代碼更清潔。這種情況下的最佳做法是什麼?任何技術缺點?

+0

從我的角度來看不是一個好的做法。是的,你保存一個空檢查,但是,幾個月後,當檢查錯誤或維護代碼時,第一個例子更好地說明了代碼的用途。 – Steve

+1

它變得更糟 - 在沒有保護的情況下,處理程序可能在檢查null和調用它之間設置爲null。您應該將'handler'的值複製到一個局部變量中,並檢查_that_是否爲null。 –

+0

由於您不會將'handler'的值複製到局部變量中,因此您的第一個代碼已損壞。 – CodesInChaos

回答

1

不是在構造函數中添加空委託,而是可以將處理程序包裝在一個函數中,該函數首先檢查處理程序是否爲null,然後調用它。這個缺點是如果你有很多事件,你將會有很多包裝每個事件的函數。

private void HandlerWrapper() 
{ 
    Action localHandler = handler; 
    if (localHandler != null) handler(); 
} 
+1

與原始代碼相同的線程安全問題 – CodesInChaos

1

有趣的想法,我從來沒有想過這樣做。我做我的自定義事件的方式是我做一個OnCustomEventName參數的事件,只是在那裏檢查爲空。並從代碼中調用OnCustomEventName從任何我想要觸發的事件。 避免任何性能命中,並保持操作代碼比2行更清潔,如果每次檢查都要檢查事件。

這就是說,這不是回答有關技術劣勢的問題,而是更多地發生事件時的最佳做法。

線程安全「開啓」功能的示例代碼。

private void OnCustomEventName() 
{ 
    DelegateName localhandler = CustomEventName; 
    if (localhandler != null) 
     localhandler(); 
} 
0

我還沒有真正發現任何大的缺點做到這一點,通常我更喜歡它檢查null。我不能想到的唯一問題是,調試時可能會導致代碼中令人討厭的步驟(即,在步入事件時,必須跳過空的代理,即 )。

我認爲性能不是問題 - 如果應用程序性能通過調用事件顯着退化,那麼事件可能不應該在那裏出現。

相關問題