2017-10-17 50 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与一个空的身体并将其附加到事件。这是一个默认的事件处理程序,它不会做任何事情。