为什么要使用这个构造 - PropertyChangedEventHandler handler = this.PropertyChanged?

时间:2010-12-20 12:41:00

标签: c# propertychanged

文章http://msdn.microsoft.com/en-us/magazine/dd419663.aspx包含以下代码示例:

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{       
    PropertyChangedEventHandler handler = this.PropertyChanged;
    if (handler != null)
    {
        var e = new PropertyChangedEventArgs(propertyName);
        handler(this, e);
    }
}

我的问题是通过引入变量'handler'获得了什么 - 以下代码似乎工作正常:

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{   
    if (PropertyChanged!= null)
    {
        var e = new PropertyChangedEventArgs(propertyName);
        PropertyChanged(this, e);
    }
}

3 个答案:

答案 0 :(得分:5)

局部变量背后的原因是,在多线程环境中,事件在检查null和触发事件之间的间隙中可能没有订户(即变为空)。

通过获取局部变量,您可以避免这个潜在的问题 - 以线程安全的方式检查事件。它确实引发了一个问题,即事件可能会被抛出以前未挂钩的项目。

答案 1 :(得分:1)

这是为了线程安全。在第二个示例中,PropertyChanged的调用列表可能在if块期间变为null,从而导致异常。

答案 2 :(得分:0)

这是为了确保OnPropertyChanged方法是线程安全的。有关其他讨论,请参阅Use of null check in event handler