2013-03-03 64 views
4

我對經常在線遇到的一段代碼有疑問。例如分配給空委託的事件聲明

public static event Action<Foo> foo = delegate{ }; 

我得到了聲明的左側。但右手邊很混亂。將事件分配給帶空括號的代表的意義何在?

回答

6

event字段的默認值爲null。這要求在每次想要提升事件時都使用空檢查 - 在未初始化的event字段上調用foo()將導致NullReferenceException。僅僅給它一個合理的默認值就比較方便,就像無操作一樣,這樣你可以直接引發事件而不必使用包裝器方法或任何東西。

4

委託成員的默認值是null,所以如果您不指定任何內容,它會在您嘗試調用它時拋出NullReferenceException。你可以很容易地看到這可能是一個問題:想象一下,如果你必須訂閱OnKeyDown控制!

相當方便,在標準庫事件把守,它不等同的事情:

Event handler = OnClick 
if (handler != null) 
    handler(this, new EventArgs()); 

這是我建議,作爲表單 - 反正我 - 它看起來更乾淨。另請注意使用局部變量。它是合法的,它寫成

if(OnClick != null) OnClick(this, new EventArgs()); 

,但不是線程安全的,因爲聽者的OnClick可以空校驗和通話之間退訂。