23

.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

4

2 に答える 2

7

CallerMemberNameAttribute、呼び出された関数でのみ使用でき、呼び出し元関数の名前を取得できます。

オペレーターはそれnameofをはるかに超えています。どこでも使用できます。

WPF データ バインディングの範囲内でそれについて推論したい場合は、次の例を見てください。

public string FullName
{
   get
   {
       return string.Format(
           "{0} {1}",
           this.firstName,
           this.lastName);
   }
}

public string FirstName
{
   get
   {
       return this.firstName;
   }
   set
   {
       if (value != this.firstName)
       {
           this.firstName = value;
           NotifyPropertyChanged(nameof(FirstName));
           NotifyPropertyChanged(nameof(FullName));
        }
   }
}

public string LasttName
{
   get
   {
       return this.lastName;
   }
   set
   {
       if (value != this.lastName)
       {
           this.lastName = value;
           NotifyPropertyChanged(nameof(LasttName));
           NotifyPropertyChanged(nameof(FullName));
        }
   }
}
于 2015-02-08T19:31:02.617 に答える