如果你刚刚这样做:
PropertyChanged(this, new PropertyChangedEventArgs(name))
NullReferenceException
如果没有人订阅该事件,您会得到一个PropertyChanged
。为了解决这个问题,您添加了一个空检查:
if(PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name))
}
现在,如果您使用多线程,有人可以在 null 检查和事件调用之间取消订阅,所以您仍然可以获得 NullReferenceException
. 为了处理它,我们将事件处理程序复制到一个临时变量
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
现在,如果有人取消订阅该事件,我们的临时变量handler
仍将指向旧函数,并且此代码现在无法抛出NullReferenceException
.
大多数情况下,您会看到人们使用关键字var
来代替,这使得您无需输入临时变量的完整类型,这是您在代码中最常看到的形式。
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}