处理可能没有任何订户的事件

时间:2012-03-01 16:41:20

标签: c# events

如果类在其方法中触发事件,则该类不必知道订阅其事件的内容或者谁。如果有任何订户,这也不重要。

在下面的代码中,如果OnTrigger事件没有订阅者,则会发生异常。

public class EventTrigger
{
    public static void Main(string[] args)
    {
        (new EventTrigger()).Trigger();
    }

    public delegate void Delegate1();
    public event Delegate1 OnTrigger;

    void Trigger()
    {
        OnTrigger();
    }
}

我可以像这样召唤这个事件;

if (OnTrigger != null)
{
    OnTrigger();
}

但这对我来说似乎很奇怪,因为触发器不必了解订阅。

我的问题是:

每当我使用它时,是否必须检查事件引用是否为空。

2 个答案:

答案 0 :(得分:2)

如果您初始化OnTrigger,那么您不必进行检查。 e.g。

public event Action OnTrigger = delegate { };

是'delegate {}'实例化一个新对象,这就是为什么这允许你省略'空'检查。

'delegate {}'什么都不返回,所以如果你想要它返回一个字符串(如果Delegate1返回一个字符串你需要它),那么你只需要添加'return“”;'例如:

public event Action OnTrigger = delegate { return string.Empty; };

我应该补充的是,为了避免空检查,这样做是不好的做法,因为这是一个懒惰的黑客攻击。有些代码仍然可以将事件设置为null,'OnTrigger = null'会破坏您的代码。当涉及到(de)序列化时,它根本不起作用。

答案 1 :(得分:1)

触发器不必了解各个订户,但确实需要了解订阅。您必须每次都进行空检查或使用Simon建议的解决方法。