2016-06-21 4 views
2

CallerMemberNameはどのように実装されていますか?メンバー名がnameofのメソッドを提供する必要がありますか、それともCallerMemberNameに依存して私のために行う必要がありますか?

それは私たちのコードから魔法の文字列を保つことができますが、それはnameofを超えて使用すべきでしょうか。

どのような相違点/どのようにCallerMemberNameは正確に機能しますか?

+3

これらは、2つの無関係のシナリオ用です。 'CallerMemberName'はあなたを呼んでいる人を示し、' nameof'はあなたが呼んでいる人を知らせます。 – GSerg

+2

私は質問があると思います: 'nameof'を使ってメンバ名を持つメソッドを提供するのですか、それとも' CallerMemberName'に依存して私のために行うべきですか? –

+0

@PatrickHofman true、ill edit – Mafii

答えて

4

CallerMemberNameは、現在のメンバの名前を別のメソッドの呼び出しに配置するためのコンパイル時のトリックです。 nameofも同様のことをするためのコンパイル時のトリックです:メンバーの文字列表現が必要です。

これはあなた次第です。私は言うでしょう:CallerMemberName可能なところで、nameofあなたがする必要があります。 CallerMemberNameはさらにnameofよりも自動化されているので、私はそれを好む理由です。

どちらも同じパフォーマンス上の意味を持ちます。コンパイル時にはコードを評価するのに余分な時間がかかりますが、それは無視できます。

+0

したがって、コールは文字列を使った単純な呼び出しに変わります(nameofの代わりに文字列リテラルを使用する場合と同じです) – Mafii

+1

確かに。それはまったく同じです。 –

4

[CallerMemberName]およびnameofは完全に互換性がありません。

class Foo : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    private string title; 

    public string Title 
    { 
     get { return title; } 
     set 
     { 
      if (title != value) 
      { 
       title = value; 
       // we're using CallerMemberName here 
       OnPropertyChanged(); 
      } 
     } 
    } 

    public void Add(decimal value) 
    { 
     Amount += value; 
     // we can't use CallerMemberName here, because it will be "Add"; 
     // instead of this we have to use "nameof" to tell, what property was changed 
     OnPropertyChanged(nameof(Amount)); 
    } 

    public decimal Amount { get; private set; } 
} 
関連する問題