为什么我们不直接调用事件?

时间:2012-07-30 21:10:26

标签: c# .net events event-handling

我见过许多开发人员想要调用Event时,他们将其分配给名为handler的本地变量并调用handler而不是直接调用Event。 为什么我们不直接调用事件?

private void OnSomethingChanged(EventArgs e)
{
    if (SomethingEvent != null)
    {
        SomethingEvent(this, e);
    }
}

3 个答案:

答案 0 :(得分:5)

您发布的代码基本上不是线程安全的。如果最终订阅者在 if检查之后取消订阅,但在调用之前取消,则会获得NullReferenceException

一种选择是编写扩展方法:

public static void NullSafeInvoke(this EventHandler handler,
                                  object sender, EventArgs e)
{
    if (handler != null)
    {
        handler(this, e);
    }
}

然后你可以写:

private void OnSomethingChanged(EventArgs e)
{
    SomethingEvent.NullSafeInvoke(this, e);
}

你可能也想要EventHandler<T>的另一个重载。

答案 1 :(得分:4)

如果未复制事件,则可能存在竞争条件(仅与多线程应用程序相关)。

如果一个帖子在null检查后立即取消订阅,则不会订阅任何内容,您将获得NullReferenceException

答案 2 :(得分:0)

我也不明白为什么。有一种简单而安全的方法:

// when constructing of instance, to create empty subscription
public event EventHandler SomethingEvent = delegate { }; 

private void OnSomethingChanged(EventArgs e)
{
    // and call it directly
    SomethingEvent(this, e);
}