检查处理程序!= null vs检查C#中是否有事件!= null

Cle*_*ang 3 c# null events delegates handler

我已经看到了各种编码样式来在C#中触发事件.第一种风格包括以下内容:

-an事件处理程序

    public delegate void NumberReachedEventHandler(object sender, 
    NumberReachedEventArgs e);
Run Code Online (Sandbox Code Playgroud)

-一个事件

    public event NumberReachedEventHandler NumberReached;
Run Code Online (Sandbox Code Playgroud)

- 以及触发事件的方法

    protected virtual void OnNumberReached(NumberReachedEventArgs e)
    {
        if(NumberReached != null)
        {
            NumberReached(this, e);
        }
    }
Run Code Online (Sandbox Code Playgroud)

然而,第二种风格有一种不同的方法来触发事件:

    protected virtual void OnNumberReached(NumberReachedEventArgs e)
    {
        NumberReachedEventHandler handler = NumberReached;
        if(handler != null)
        {
            handler(this, e);
        }
    }
Run Code Online (Sandbox Code Playgroud)

对我来说,似乎一个样式检查"event"是否为null,第二个样式检查委托是否为null.但是,我的理解是一个事件只是一个委托的实例,所以我想知道编写代码的方式是否有任何优势.如果是,请解释.提前致谢.

Eri*_*ert 11

两者都在检查与事件关联的委托是否为空.

存储到本地的目的是防止多线程代码中的TOCTOU风格竞争.

值得注意的是,使用本地只能消除两种潜在种族中的一种.有关详细信息,请参阅我在2009年关于此主题的文章:http://blogs.msdn.com/b/ericlippert/archive/2009/04/29/events-and-races.aspx

还有这个问题:

C#事件和线程安全