为什么要引入临时变量?

时间:2014-06-26 06:42:39

标签: c# events

我看到了很多以下事件处理程序的用法。为什么他们将处理程序分配给局部变量然后使用局部变量?

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(...)" 
}

4 个答案:

答案 0 :(得分:4)

临时变量确保线程安全,因为在检查和实际调用之间,其他线程可以取消订阅将导致NullReferenceException的事件。

Eric Lippert有a great article on this

答案 1 :(得分:0)

因为PropertyChanged 可以因其他线程的操作而发生变化;特别是,它可以在空检查和调用之间设置为空。

答案 2 :(得分:0)

因为在多线程环境中,如果事件的最后一个订阅者在if之后但在调用之前取消订阅,您将获得NullRefrenceExecption。通过首先在本地复制委托,它不能再被取消订阅修改。

答案 3 :(得分:0)

想象一下:

if (PropertyChanged)
  PropertyChanged(...)

现在就在if操作系统跳过线程之后,新的线程将删除唯一的订阅。在此PropertyChangednull之后,您遇到了麻烦。