C# 为什么要引入临时变量?

C# 为什么要引入临时变量?,c#,events,C#,Events,我看到了事件处理程序的以下许多用法。为什么他们将处理程序分配给局部变量,然后使用局部变量 event EventHandler PropertyChanged; private void RaisePropertyChanged(string propertyName) { var temp = PropertyChanged; if (temp != null) temp(this, new PropertyChangedEventArgs(propertyN

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

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

因为PropertyChanged可能会因为其他线程的操作而改变;特别是,它可以在null检查和调用之间设置为null。

因为PropertyChanged可能会因其他线程的操作而更改;特别是,它可以在null检查和调用之间设置为null。

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


Eric Lippert使用了

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


Eric Lippert拥有

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

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

想象一下:

if (PropertyChanged)
  PropertyChanged(...)
现在,就在
if
之后,操作系统跳过线程,新的线程将删除唯一的订阅。在此之后,
PropertyChanged
null
,您就有麻烦了。

想象一下:

if (PropertyChanged)
  PropertyChanged(...)

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

如果我编写的winforms应用程序只在表单加载事件中分配事件处理程序,我是否可以忽略该模式?后台工作人员用于分配控件的数据源。+1感谢链接到article@dc7a9163d9提到后台工作程序意味着您已经做了一些多线程处理,所以我建议使用temp变量。无论发生什么,我都将使用该模式。只是好奇如果后台工作人员从不取消订阅事件处理程序是否安全。如果我正在编写一个winforms应用程序,该应用程序只在表单加载事件中分配事件处理程序,我是否可以忽略该模式?后台工作人员用于分配控件的数据源。+1感谢链接到article@dc7a9163d9提到后台工作程序意味着您已经做了一些多线程处理,所以我建议使用temp变量。无论发生什么,我都将使用该模式。只是好奇如果后台工作人员从不取消订阅事件处理程序是否安全。