6

可能重复:
在事件声明中添加匿名空委托是否有不利之处?

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

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

为这个事件分配一个空代表有什么缺点吗?这将在if !=null触发事件的任何地方保存条件。当然,这只适用于当我们不能保证事件总是被分配一个适当的委托时。

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

当然,性能会受到轻微影响,但它会使代码更简洁。在这种情况下,最佳做法是什么?有什么技术劣势吗?

4

3 回答 3

1

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

private void HandlerWrapper()
{
    Action localHandler = handler;
    if (localHandler != null) handler();
}
于 2012-05-24T11:44:03.927 回答
1

有趣的想法,我从来没有想过这样做。我执行自定义事件的方式是创建一个 OnCustomEventName 以获取事件的参数,然后在此处检查是否为空。并在我希望触发事件的任何地方从代码中调用 OnCustomEventName。如果每次您希望触发事件时都进行检查,则可以避免任何性能损失并使操作代码比 2 行代码更简洁。

话虽如此,这并没有回答有关技术劣势的问题,而是在触发事件时更多的最佳实践。

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

private void OnCustomEventName()
{
    DelegateName localhandler = CustomEventName;
    if (localhandler != null)
        localhandler();
}
于 2012-05-24T11:44:15.220 回答
0

我还没有真正发现这样做的任何重大缺点,通常我更喜欢它而不是检查空值。我想不到的唯一问题是,它可能会在调试时导致代码中出现烦人的步骤(即,每次进入事件时都必须越过空委托)。

我认为性能不是问题——如果应用程序性能因调用事件而显着下降,那么事件可能一开始就不应该存在。

于 2012-05-24T11:50:33.510 回答