C# 声明时的事件初始化

C# 声明时的事件初始化,c#,C#,下面的初始化是做什么的?我不理解委托{}部分 public event EventHandler Updated = delegate { }; 它使事件处理程序执行一个空代码块。通常情况下,它会被指定为null,但是在触发代码中,您需要检查处理程序是否为null。有人认为这会使代码更干净这会创建一个具有空主体的新代码,并将其附加到事件。这是一个默认的事件处理程序,它不做任何事情。这里发生了一些事情,这得益于语言构造。让我们把它分解一下: 首先,您正在创建一个公共事件: public even

下面的初始化是做什么的?我不理解
委托{}
部分

public event EventHandler Updated = delegate { };

它使事件处理程序执行一个空代码块。通常情况下,它会被指定为null,但是在触发代码中,您需要检查处理程序是否为null。有人认为这会使代码更干净

这会创建一个具有空主体的新代码,并将其附加到事件。这是一个默认的事件处理程序,它不做任何事情。

这里发生了一些事情,这得益于语言构造。让我们把它分解一下:

首先,您正在创建一个公共事件:

public event EventHandler Updated;
然后,将其初始化为“默认处理程序”:

其中,
xxx
应该是
EventHandler
类型的处理程序。这是那个家伙的签名:

public delegate void EventHandler(object sender, EventArgs e);
任何希望订阅该活动的人都应遵守该签名

出于某种奇怪的原因(我不知道),编译器允许您提供一个默认实现(属性初始值设定项),该实现不符合预期的签名(???):

请注意,没有参数。这就是签名应该是什么(它编译得很好):

然后您就可以访问代码中的这些对象

因此,本质上,您提供了一个默认的内联委托方法,该方法将在触发
Updated
事件时执行。当然,此委托中没有指令(空块)。您可以通过稍微更改来测试这一点:

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

如果有人知道允许这种类型的无参数委托的基本原理,并能补充这个答案,那就太好了。

这是一个“匿名”函数,什么都不做。你对
委托
关键字做了什么研究,你发现了什么,它是如何无法回答你的问题的?我不同意它能让代码更干净。检查null非常简单,只需调用“”
public event EventHandler Updated = delegate { };
public event EventHandler Updated = delegate(object sender, EventArgs e){  };
public event EventHandler Updated = delegate { Console.Writeline("It fired!"); };