随着 .NET 4.5.3 的出现,WPF 开发人员现在有三种(或更多)方法来通知INotifyPropertyChanged
接口属性更改。基本上,我的问题是从 .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));
}
}
第三种也是最新的方法已(或即将)作为 .NET 4.5.3 的一部分在 C#6.0 中引入;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));
}
我自己的假设是,简单地传递字符串的原始、更容易出错的方法将是最有效的,因为我只能想象其他两种方法使用某种形式的反射。但是,我真的很想知道其他两种方法中哪一种更有效,以及在 WPF 上下文中使用CallerMemberNameAttribute
属性和运算符之间是否真的有任何区别。nameof