2014-03-03 65 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

相关问题