我看到了很多以下事件处理程序的用法。为什么他们将处理程序分配给局部变量然后使用局部变量?
event EventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
var temp = PropertyChanged;
if (temp != null)
temp(this, new PropertyChangedEventArgs(propertyName));
// why not just "if (PropertyChanged != null) PropertyChanged(...)"
}
答案 0 :(得分:4)
临时变量确保线程安全,因为在检查和实际调用之间,其他线程可以取消订阅将导致NullReferenceException
的事件。
Eric Lippert有a great article on this
答案 1 :(得分:0)
因为PropertyChanged 可以因其他线程的操作而发生变化;特别是,它可以在空检查和调用之间设置为空。
答案 2 :(得分:0)
因为在多线程环境中,如果事件的最后一个订阅者在if
之后但在调用之前取消订阅,您将获得NullRefrenceExecption。通过首先在本地复制委托,它不能再被取消订阅修改。
答案 3 :(得分:0)
想象一下:
if (PropertyChanged)
PropertyChanged(...)
现在就在if
操作系统跳过线程之后,新的线程将删除唯一的订阅。在此PropertyChanged
为null
之后,您遇到了麻烦。