我开始阅读有关 MVVM 的内容,我经常看到的一种模式是:
public event PropertyChangedEventHandler PropertyChanged;
//.....
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
为什么要声明这个 handler
变量?在我看来,它只是不必要地使代码复杂化,但我什至可以在 Microsoft 自己的教程中看到这一点,为什么不将其用作:
if (this.PropertyChanged != null)
{
var e = new PropertyChangedEventArgs(propertyName);
this.PropertyChanged(this, e);
}
最佳答案
关闭 PropertyChanged
事件是为了线程安全。事实上,从技术上讲,您应该对所有您的事件执行此操作。
赋值会创建事件及其处理程序的副本(不是引用,这将毫无用处),这意味着您可以避免事件处理程序在传递后立即设置为 null
的情况null
检查。这避免了会引发 NullReferenceException 的潜在竞争条件。
实际上,UI 并不经常将该属性设置为 null(如果有的话)。但是,为了安全起见并采用良好做法,您应该关闭处理程序。
关于C# INotifyPropertyChanged 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27805397/