可能重复:
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();
当然,性能略有下降,但它使代码更清晰。在这种情况下,最佳做法是什么?任何技术缺点?
答案 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。我无法想到的唯一问题是,在调试时可能会导致代码中的烦人步骤(即 每当踏入事件时都必须跨过空委托。)
我认为性能不是问题 - 如果应用程序性能通过调用事件而显着退化,那么事件可能不应该首先出现在那里。