是否可以始终添加空事件处理程序?

时间:2012-05-24 11:36:43

标签: c# .net events delegates null

  

可能重复:
  Is there a downside to adding an anonymous empty delegate on event declaration?

使用事件处理程序(在C#中)时,以下模式非常常见:

public event Action handler;
…
// some method:
if(handler != null) handler();

为此事件分配空委托是否有任何缺点?这样可以在任何地方保存if !=null条件,事件被触发。当然,这仅适用于我们无法保证事件总是被分配了适当的委托。

public event Action handler;
…
// in constructor:
handler += ()=>{};
…
// some method:
handler();

当然,性能略有下降,但它使代码更清晰。在这种情况下,最佳做法是什么?任何技术缺点?

3 个答案:

答案 0 :(得分:1)

不是在构造函数中添加空委托,而是可以将处理程序包装在一个函数中,该函数首先检查处理程序是否为null然后调用它。这样做的缺点是如果你有很多事件,你将有很多函数来包装每个事件。

private void HandlerWrapper()
{
    Action localHandler = handler;
    if (localHandler != null) handler();
}

答案 1 :(得分:1)

有趣的想法,我从来没有想过这样做。我做自定义事件的方式是我创建一个OnCustomEventName获取事件的参数,然后在那里检查null。并从我想要触发事件的代码中调用OnCustomEventName。 如果您希望每次触发事件,请检查是否存在任何性能命中并使操作代码比2行更清晰。

据说这不是回答有关技术劣势的问题,而是解雇事件时的最佳做法。

线程安全“开启”功能的示例代码。

private void OnCustomEventName()
{
    DelegateName localhandler = CustomEventName;
    if (localhandler != null)
        localhandler();
}

答案 2 :(得分:0)

我还没有发现任何重大缺点,通常我更喜欢检查null。我无法想到的唯一问题是,在调试时可能会导致代码中的烦人步骤(即 每当踏入事件时都必须跨过空委托。)

我认为性能不是问题 - 如果应用程序性能通过调用事件而显着退化,那么事件可能不应该首先出现在那里。