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

sab*_*ber 3 .net c# events event-handling

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

private void OnSomethingChanged(EventArgs e)
{
    if (SomethingEvent != null)
    {
        SomethingEvent(this, e);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

你发布的代码基本上不是线程安全的.如果最终用户在不同的线程退订if检查,但之前调用,你会得到一个NullReferenceException.

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

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

然后你可以写:

private void OnSomethingChanged(EventArgs e)
{
    SomethingEvent.NullSafeInvoke(this, e);
}
Run Code Online (Sandbox Code Playgroud)

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