文章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);
}
}
答案 0 :(得分:5)
局部变量背后的原因是,在多线程环境中,事件在检查null和触发事件之间的间隙中可能没有订户(即变为空)。
通过获取局部变量,您可以避免这个潜在的问题 - 以线程安全的方式检查事件。它确实引发了一个问题,即事件可能会被抛出以前未挂钩的项目。
答案 1 :(得分:1)
这是为了线程安全。在第二个示例中,PropertyChanged的调用列表可能在if块期间变为null,从而导致异常。
答案 2 :(得分:0)
这是为了确保OnPropertyChanged方法是线程安全的。有关其他讨论,请参阅Use of null check in event handler。