Зачем использовать эту конструкцию - PropertyChangedEventHandler handler = this.PropertyChanged? - PullRequest
6 голосов
/ 20 декабря 2010

В статье http://msdn.microsoft.com/en-us/magazine/dd419663.aspx приведен следующий пример кода:

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{       
    PropertyChangedEventHandler handler = this.PropertyChanged;
    if (handler != null)
    {
        var e = new PropertyChangedEventArgs(propertyName);
        handler(this, e);
    }
}

Мой вопрос заключается в том, что можно получить, введя переменную 'handler' - следующий код работает нормально:

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{   
    if (PropertyChanged!= null)
    {
        var e = new PropertyChangedEventArgs(propertyName);
        PropertyChanged(this, e);
    }
}

Ответы [ 3 ]

5 голосов
/ 20 декабря 2010

Причина локальной переменной заключается в том, что в многопоточной среде событие может быть лишено подписчиков (т. Е. Становится нулевым) в промежутке между проверкой на нулевое значение и инициированием события.

Используя локальную переменную, вы избегаете этой потенциальной проблемы - проверки события потокобезопасным способом.Это поднимает вопрос о том, что событие может быть сгенерировано для предмета, который ранее был отцеплен.

1 голос
/ 20 декабря 2010

Это сделано для безопасности потока.Во втором примере возможно, что список вызовов PropertyChanged мог стать нулевым во время блока if, что привело к исключению.

0 голосов
/ 20 декабря 2010

Это делается для того, чтобы метод OnPropertyChanged был потокобезопаснымСм. Использование нулевой проверки в обработчике событий для другого обсуждения.

...