2014-03-03 63 views
0

鍋爐板OnPropertyChanged代碼,你可能會看到在幾乎任何數據綁定示例如下爲什麼你重新聲明PropertyChangedEventHandler是不是它redunded?

public event PropertyChangedEventHandler PropertyChanged; 
protected void OnPropertyChanged(string propertyName) 
{  
    PropertyChangedEventHandler handler = PropertyChanged; 
    if(handler!=null) 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
} 

難道這不是多餘的關係嗎?這難道不容易嗎?

public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string propertyName) 
    {  
     if(PropertyChanged!=null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

我相信我們這樣做的原因是我找不到它。

回答

0

使用第二個實現可能會讓另一個線程在空檢查通過但調用委託之前刪除唯一的剩餘事件處理程序,從而導致空裁判異常。通過在檢查之前複製委託(委託是不可變的,刪除處理器意味着分配新的委託,而不是改變現有的委託)意味着這種NRE是不可能的。然而,在已被刪除之後,可能會引起處理程序,這也會導致問題。

如果您知道該事件沒有處理程序添加/從除線程觸發事件之外的其他線程中移除,則兩者是等效的。

+0

但在任何情況下,您正在調用原來的屬性更改事件。因此,如果它被註銷,它仍然會導致空引用異常 –

+0

@AMR不,它不會。正如我所說,代表是不可改變的。移除處理程序不會改變引用的對象,而是創建一個新的委託並將其指定給'PropertyChanged'。當你將它拉出到一個本地時,它將會是null或者不是。它永遠不會改變,即使用於設置它的字段已更改。 – Servy

相關問題