我已经注意到在C#中发现事件的所有样本中,触发事件的样本写成:
PropertyChangedEventHandler handler = PropertyChanged;
if(handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
只是写作之间有什么不同:
if(PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
答案 0 :(得分:8)
在第二个示例中,您两次调用PropertyChanged
的getter。在多线程环境中,可以在调用之间更改值。
在第一个示例中,首先制作本地副本会阻止这种情况。
答案 1 :(得分:4)
在第二种情况下,如果您正在运行多线程,则PropertyChanged
的值可能会在if
和调用之间发生变化。不建议这样做。
您也可以尝试初始化事件处理程序,使其具有如下所示的空处理程序:
public EventHandler<PropertyChangeEventArgs> PropertyChanged = (s, e) => { };
这意味着它永远不会为null,所以你可以将其解雇为。