2011-10-27 61 views
4

我在看NotifyPropertyChanged()INotifyPropertyChanged,并注意到,在微软的例子,如这里:是否NotifyPropertyChanged线程安全?

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

没有委托引用的捕获第一(因为它说,在这里做,例如:Use of null check in event handler

我查看了自动生成的Reference.cs中的ServiceReferences,并且完成了此检查。

所以我的问题是我应该这样做(以任何形式,如扩展方法等)?如果我不这样做,是否有任何可能的问题?

回答

7

你说得对,检查应该完成,他们的例子是错误的。

以下是标准代码。

private void NotifyPropertyChanged(String propertyName) 
{ 
    var handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler (this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

编辑:为什么这是需要(为什么它的工作原理)进一步的解释

在他们直接做的PropertyChanged空校验,然后调用它的MS的例子。所以PropertyChanged可能会在空检查和调用之间变为空。通过将委托分配给局部变量,我们可以确保我们保留对委托的引用,并且它不能在空检查和调用之间进行更改。

+0

好的,我看过的微软例子并不是最好的。感谢回复 – Firedragon

+0

他们在MS例子中就是这么做的......我是否盲目? – fixagon

+0

@fantasticfix PropertyChanged必须首先复制到本地变量 – Simon