INotifyProperyChanged - 为什么额外的任务?

Per*_*Per 5 .net c# inotifypropertychanged

INotifyPropertyChanged以最基本的形式实现接口时,大多数人似乎都像这样实现它::

public virtual void OnPropertyChanged(string propertyName)
{
    var propertyChanged = PropertyChanged;
    if (propertyChanged != null)
    {
        propertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么要额外分配var propertyChanged = PropertyChanged;?这只是一个偏好的问题,还是有充分的理由呢?当然以下是有效的吗?

public virtual void OnPropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
Run Code Online (Sandbox Code Playgroud)

aha*_*ker 4

对临时变量的赋值消除了空检查和最后一个事件订阅者取消订阅之间出现竞争条件的可能性。请参阅此处的.NET 事件指南。

截图:

    // Make a temporary copy of the event to avoid possibility of
    // a race condition if the last subscriber unsubscribes
    // immediately after the null check and before the event is raised.
    EventHandler<CustomEventArgs> handler = RaiseCustomEvent; 
Run Code Online (Sandbox Code Playgroud)