c# - 检查处理程序是否!= null 与检查事件是否!= C# 中的 null

标签 c# events delegates null handler

<分区>

我见过在 C# 中触发事件的各种编码风格。 第一个样式由以下内容组成:

-一个事件处理器

    public delegate void NumberReachedEventHandler(object sender, 
    NumberReachedEventArgs e);

-一个事件

    public event NumberReachedEventHandler NumberReached;

-以及触发事件的方法

    protected virtual void OnNumberReached(NumberReachedEventArgs e)
    {
        if(NumberReached != null)
        {
            NumberReached(this, e);
        }
    }

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

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

对我来说,似乎一种样式检查“事件”是否为空,第二种样式检查委托(delegate)是否为空。但是,我的理解是事件只是委托(delegate)的一个实例,所以我想知道这两种编写代码的方式是否有任何优势。如果是这样,请解释。提前致谢。

最佳答案

两者都在检查与事件关联的委托(delegate)是否为空。

存储到本地的目的是为了防止TOCTOU多线程代码中的 -style race。

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

还有这个问题:

C# Events and Thread Safety

关于c# - 检查处理程序是否!= null 与检查事件是否!= C# 中的 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18027063/

相关文章:

c# - 使用 Selenium 在 textArea 中输入完整的 html

c# - 如何使用我的 InstanceProvider 使用自己的构造函数调用 WCF 服务

javascript - 对元素的显示属性的更改进行一些操作

javascript - jQuery:让一个元素充当另一个元素的事件代理

swift - 如何使用 Swift 在 MVC 中避免臃肿的 ViewController?

c# - 如何分离 NCrunch 节点服务使用的所有 LocalDb 数据库

c# - 深入学习 C# 表达式树的最佳资源是什么?

javascript - 如何从外部触发的自定义插件内部获取事件而不将其作为参数传递?

ios - 委托(delegate)调用后 Swift 对象不会更新

c# - 具有可变参数的函数的委托(delegate)