2010-12-07 16 views
2

在回答我的其他問題How to send custom event message just after control instantiation?我這樣說的:我不明白事件委託的雙重語法

if (ValueChanged != null) 
{ 
    ValueChanged(sender, e); 
} 

是什麼的ValueChanged在第一種情況?不是第二條指令中的函數嗎?如何將同一個符號用於...和函數?

uPDATE james的答案後:如果ValueChanged是一個對象,我怎麼能稱它爲好像它是一個方法?它是一種語法糖或外來語法,帶有一些神祕的機制,如調用ValueChanged.Invoke(sender,e); ?

回答

3

ValueChanged是一個多播代表,它是一個對象。如果沒有人訂閱了該事件,則它可以爲空,因此該檢查。如果您想避免檢查,您可以定義一個空的委託並將其分配給事件。

public event EventHandler ValueChanged = delegate {}; 

現在,您可以只需要調用的ValueChanged(發件人,E),因爲可以的ValueChanged永遠是空的。

+0

嘿謝謝愛這個想法從來沒有null。 – user310291 2010-12-07 22:51:24

1

ValueChanged在兩種情況下都是相同的。

首先,你檢查它是否爲空,如果沒有訂戶,情況就是這樣。

其次,您使用類似方法的語法執行委託。

1

事件只是代表 - 對其他地方的函數的引用。當調用上述事件時,我們調用委託。由於代表只是對函數的引用,因此我們需要處理之前可能沒有設置的情況(I.E. null)

1

ValueChanged是參考到一個或多個函數。如果沒有引用,則該值將爲空。如果該值不爲空,則所有引用的函數將由ValueChanged(sender, e);語法調用。

2

像C#中的許多事情一樣,語言特性旨在使事情更輕鬆。想想ValueChanged作爲一個字段,你檢查它爲空(內部委託將檢查用戶)和

ValueChanged.Invoke(sender, e); 

第二速記版本的事件的實際簽名是不是當然的領域更。它公開了用戶的公共添加/刪除屬性以及用於調用的私有字段。