【问题标题】:Why assign a handler to an event before calling it?为什么在调用事件之前为其分配处理程序?
【发布时间】:2011-02-28 20:47:57
【问题描述】:

基本上,我经常看到这种情况:

    public event MyEventHandler MyEvent;

    private void SomeFunction()
    {
        MyEventHandler handler = this.MyEvent;

        if (handler != null)
        {
            handler(this, new MyEventArgs());
        }
    }

当它可以像这样轻松完成时:

    public event MyEventHandler MyEvent;

    private void SomeFunction()
    {
        if (MyEvent != null)
        {
            MyEvent(this, new MyEventArgs());
        }
    }

那么,我错过了什么吗?人们是否有某种原因将事件分配给处理程序,然后引发处理程序而不是事件本身?它只是“最佳实践”吗?

【问题讨论】:

    标签: c# events


    【解决方案1】:

    对局部变量的赋值确保如果事件在if 和实际调用之间被取消注册,调用列表不会为空(因为变量将具有副本原始调用列表)。

    这很容易发生在多线程代码中,在检查 null 和触发事件之间,它可能被另一个线程取消注册。

    请参阅this SO 问题和答案。

    【讨论】:

      【解决方案2】:

      线程安全。

      如果在您检查 MyEvent 是否为 null 并触发 MyEvent 之间,另一个线程出现并取消订阅该事件,会发生什么情况?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-28
        • 2020-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多