实现INotifyPropertyChanged的模式?

时间:2010-12-16 14:37:21

标签: .net inotifypropertychanged

我见过以下用于实现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 吗?

由于

3 个答案:

答案 0 :(得分:4)

Eric Lippert在此博客文章中详细解释了这一点:Events and races

基本上,我们的想法是避免竞争条件,以防另一个线程在您检查PropertyChanged != null之后但在您实际调用PropertyChanged之前取消订阅此事件的最后一个处理程序。如果您制作处理程序的本地副本,则不会发生这种情况(但您最终可能会调用刚刚取消订阅的处理程序)

答案 1 :(得分:1)

这是引发事件的线程安全方法。通过在使用之前在本地分配可公开访问的PropertyChanged事件,您可以确保'if'语句与实际引发事件的行之间没有区别。

答案 2 :(得分:0)

在多线程世界中,在评估if语句后,PropertyChanged可能会设置为null。