可能重复:
Is there a downside to adding an anonymous empty delegate on event declaration?
为事件定义一个空委托主体是一个好习惯,这样您就不必担心引发没有事件处理程序的事件了吗? (无需检查事件是否为空)。
如下面的代码:
public event EventHandler<LoadEventArgs> LoadedData = delegate { };
答案 0 :(得分:38)
我当然觉得它很有用,是的。将会有一个微小的,微小的性能成本 - 但不必执行无效测试的可读性的好处使它值得IMO。
值得指出的是,这是使用匿名方法而不是lambda表达式的好几次之一 - 否则你必须命名你将要忽略的参数,如下所示:
public event EventHandler<LoadEventArgs> LoadedData = (sender, args) => {};
我不喜欢说出我不打算使用的东西:)
答案 1 :(得分:4)
我不会这样做。
这有两个原因。首先,在调用它之前简单地检查null
的处理程序是标准的。在示例中,您可以在Microsoft参考源和in the manuals中看到这一点。
其次,以这种方式初始化事件会在创建类时分配不必要的对象。这将为您的应用程序带来额外的内存压力而无需实际需要。这是因为:
public event EventHandler<LoadEventArgs> LoadedData = delegate { };
转换为:
public event EventHandler<LoadEventArgs> LoadedData = new EventHandler<LoadEventArgs>delegate { });
如果您还没有这样做,将事件包装在特定方法中会有很大帮助:
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);
}
答案 2 :(得分:1)
我通常不使用C#,但对我来说这似乎是一种好习惯。这是“Null Object”模式的教科书应用程序。如上所述,当空委托实际运行时,这将在性能方面付出代价,但是当您不必检查明确的空值时,每隔一段时间就会在性能方面获益 - 所以它也应该是净胜利性能 - 只要空代表的频率很低,就明智了。