.NET 4.5.3 の出現により、WPF 開発者は、プロパティの変更をINotifyPropertyChanged
インターフェイスに通知する 3 つ (またはそれ以上) の方法を使用できるようになりました。基本的に、私の質問は、.NET 4.5 以降で導入された 2 つの方法のどちらが、プロパティの変更を通知するより効率的な方法であり、WPF で使用する場合にどちらの方法にも利点があるかどうかです。
バックグラウンド
このテーマにあまり詳しくない人のために、主な 3 つの方法を次に示します。1 つ目は、単純に文字列を渡す元の、よりエラーが発生しやすい方法です。
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));
}
}
2 番目の方法は .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));
}
}
3 番目の最新の方法は、.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));
}
私自身の推測では、単純に文字列を渡す元の、よりエラーが発生しやすい方法が最も効率的であると思います。他の 2 つの方法は何らかの形式のリフレクションを使用しているとしか想像できないからです。ただし、他の 2 つの方法のどちらがより効率的で、WPF コンテキストでのCallerMemberNameAttribute
属性と演算子の使用に実際に違いがあるかどうかを知りたいと思っています。nameof