这是一个非常简单的问题,但我想知道是否有人可以解释第 4 行实际上在做什么?所以第一行给处理程序一个事件。我真的不知道在什么情况下处理程序会返回 null 或最后一行的作用。
当您将对象和更改的属性传递给处理程序时,它对它们做了什么?
PropertyChangedEventHandler handler = PropertyChanged; //property changed is the event
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
我想我是用它来得到这个 code但我想充分了解它在做什么。
最佳答案
如果你刚刚做了:
PropertyChanged(this, new PropertyChangedEventArgs(name))
如果没有人订阅事件 PropertyChanged
,您将得到一个 NullReferenceException
。为了解决这个问题,您添加了一个空检查:
if(PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name))
}
现在,如果您使用多线程,有人可以在空检查和事件调用之间取消订阅,因此您仍然可以获得 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));
}
关于c# - PropertyChangedEventHandler 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17736571/