为事件定义空委托主体是一个好习惯吗?

可能重复:
在事件声明中添加匿名空委托是否有缺点?

为事件定义一个空的委托主体是一个好习惯,这样你就不必担心引发一个没有事件处理程序的事件了吗? (无需检查事件是否为空)。

像下面的代码:

public event EventHandler LoadedData = delegate { }; 

我当然觉得它很有用,是的。 将会有一个微小的,微小的性能成本 – 但不必执行无效测试的可读性的好处使它值得IMO。

值得指出的是,这是使用匿名方法而不是lambda表达式的好几次之一 – 否则你必须命名你将要忽略的参数,如下所示:

 public event EventHandler LoadedData = (sender, args) => {}; 

我不喜欢说出我不打算使用的东西:)

我不会这样做。

有两个原因。 首先,在调用它之前简单地检查处理程序为null是标准的。 在示例中,您可以在Microsoft参考源和手册中看到这一点。

其次,以这种方式初始化事件会在创建类时分配不必要的对象。 这将为您的应用程序带来额外的内存压力而无需实际需要。 这是因为:

 public event EventHandler LoadedData = delegate { }; 

翻译为:

 public event EventHandler LoadedData = new EventHandlerdelegate { }); 

如果您还没有这样做,将事件包装在特定方法中会有很大帮助:

 public event EventHandler MyEvent; protected virtual void OnMyEvent(EventArgs e) { if (MyEvent != null) MyEvent(this, e); } 

您可以使用以下命令使此线程安全(r):

 public event EventHandler MyEvent; protected virtual void OnMyEvent(EventArgs e) { var handler = MyEvent; if (handler != null) handler(this, e); } 

我通常不使用C#,但对我来说这似乎是一种好习惯。 这是“ 空对象 ”模式的教科书应用程序。 如上所述,当空委托实际运行时,这将在性能方面付出代价,但是当您不必检查明确的空值时,每隔一段时间就会获得性能提升 – 所以它也应该是净胜利性能 – 只要空代表的频率很低,就明智了。