6

文章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);
    }
}

我的问题是通过引入变量“处理程序”可以获得什么 - 以下代码似乎工作正常:

public event PropertyChangedEventHandler PropertyChanged;

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

3 回答 3

5

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

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

于 2010-12-20T13:09:05.220 回答
1

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

于 2010-12-20T13:09:09.820 回答
0

这是为了确保 OnPropertyChanged 方法是线程安全的。有关另一个讨论,请参阅在事件处理程序中使用 null 检查。

于 2010-12-20T13:10:32.317 回答