2011-10-27 198 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