2017-10-17 48 views
0

以下初始化做了什麼?我不明白delegate { }部分。聲明中的事件初始化

public event EventHandler Updated = delegate { }; 
+0

這是一個「匿名」的功能,它什麼都不做。 –

+0

你對'delegate'關鍵詞做了哪些研究,你發現了什麼,以及它如何回答你的問題? – Servy

回答

0

這裏發生了一些事情,禮貌的語言結構。讓我們來分析一下:

首先,您要創建一個公共事件:

public event EventHandler Updated; 

然後,你就初始化爲 「默認處理程序」:

public event EventHandler Updated = xxx; 

xxx類型EventHandler的處理程序。以下是該簽名:

public delegate void EventHandler(object sender, EventArgs e); 

任何希望訂閱該事件的人都應該符合該簽名。

對於一些奇怪的原因,對此我並不瞭解,編譯器允許你提供一個默認的實現,它符合預期的簽名(???)(屬性初始化):

public event EventHandler Updated = delegate { }; 

注意沒有參數。這是簽名應該是什麼(它編譯罰款):

public event EventHandler Updated = delegate(object sender, EventArgs e){ }; 

,您將不得不訪問代碼中的對象。

因此,本質上,您提供了一個默認的內聯委託方法,該方法在您觸發Updated事件時執行。這個代表當然沒有任何指示(一個空白塊)。您可以通過稍微改變它測試:

public event EventHandler Updated = delegate { Console.Writeline("It fired!"); }; 

如果有人知道允許這種類型參數的代表的理由,並可以增加這個答案這將是巨大的。

0

它使事件處理程序執行一個空的代碼塊。通常它會被分配爲null,但是在觸發代碼中,您需要檢查處理程序是否爲null。有人認爲這使得代碼更清潔

+0

我不同意它使代碼更清潔。檢查null非常簡單,只需調用「?」。 –

1

這創建一個新的anonymous method與一個空的身體並將其附加到事件。這是一個默認的事件處理程序,它不會做任何事情。