我见过以下用于实现INotifyPropertyChanged的模式
private void NotifyPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
有人可以在检查它之前检查 var handler = PropertyChanged 赋值的必要性,而不是直接直接检查 PropertyChanged == null 吗?
由于
答案 0 :(得分:4)
Eric Lippert在此博客文章中详细解释了这一点:Events and races。
基本上,我们的想法是避免竞争条件,以防另一个线程在您检查PropertyChanged != null
之后但在您实际调用PropertyChanged
之前取消订阅此事件的最后一个处理程序。如果您制作处理程序的本地副本,则不会发生这种情况(但您最终可能会调用刚刚取消订阅的处理程序)
答案 1 :(得分:1)
这是引发事件的线程安全方法。通过在使用之前在本地分配可公开访问的PropertyChanged事件,您可以确保'if'语句与实际引发事件的行之间没有区别。
答案 2 :(得分:0)
在多线程世界中,在评估if语句后,PropertyChanged可能会设置为null。