С появлением .NET 4.5.3 разработчики WPF теперь имеют три (или более) способа уведомления INotifyPropertyChanged
Interface изменения свойств. В основном, мой вопрос: какой из двух методов, введенных в .NET 4.5, является более эффективным способом уведомления об изменениях свойств и может ли любой из них иметь какую-либо выгоду при использовании в WPF?
Фон
Для тех, кто не знаком с этим предметом, вот основные три метода. Первый - это оригинальный, более подверженный ошибкам метод простого пропускания строки:
public string TestValue
{
get { return testValue; }
set { testValue = value; NotifyPropertyChanged("TestValue"); }
}
protected virtual void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
Второй метод был введен в .NET 4.5; CallerMemberNameAttribute
:
public string TestValue
{
get { return testValue; }
set { testValue = value; NotifyPropertyChanged(); }
}
protected virtual void NotifyPropertyChanged([CallerMemberName]string propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
Третий и самый последний метод был (или скоро будет) представлен в С# 6.0 как часть .NET 4.5.3; nameof
Оператор:
public string TestValue
{
get { return testValue; }
set { testValue = value; NotifyPropertyChanged(nameof(TestValue)); }
}
protected virtual void NotifyPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
Мое собственное предположение заключалось бы в том, что самый эффективный метод с ошибкой простой передачи строки был бы наиболее эффективным, поскольку я могу только представить себе, что другие два метода используют некоторую форму отражения. Тем не менее, я очень хочу узнать, какой из двух других методов более эффективен и действительно ли будет какая-либо разница между использованием атрибута CallerMemberNameAttribute
и оператора nameof
в контексте WPF.