簡體   English   中英

聲明時的事件初始化

[英]Event initialization on declaration

以下初始化做什么? 我不理解delegate { }部分。

public event EventHandler Updated = delegate { };

這將創建一個新的匿名方法 ,該方法的主體為空,並將其附加到事件。 這是默認事件處理程序,不執行任何操作。

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

由於語言結構的原因,這里發生了一些事情。 讓我們分解一下:

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

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!"); };

如果有人知道允許這種類型的無參數委托的理由,並且可以擴大這個答案,那就太好了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM