2016-06-21 4 views
2

Wie wird CallerMemberName implementiert?Sollte ich eine Methode mit einem Mitgliedsnamen mit Name von bereitstellen, oder sollte ich von CallerMemberName abhängig sein, um es für mich zu tun?

Ich bekomme, was es tut - es erlaubt uns, magische Strings aus unserem Code zu halten - aber sollte es über nameof verwendet werden und was ist performanter?

Was ist der Unterschied/wie funktioniert CallerMemberName genau?

+3

Sie sind für zwei unabhängige Szenarien. 'CallerMemberName' sagt Ihnen, wer Sie anruft,' nameof' sagt Ihnen, wen Sie anrufen. – GSerg

+2

Ich denke, die Frage ist: sollte ich eine Methode mit einem Mitgliedsnamen mit 'nameof' bereitstellen, oder sollte ich auf' CallerMemberName' angewiesen sein, es für mich zu tun? –

+0

@PatrickHofman true, ill edit – Mafii

Antwort

4

CallerMemberName ist ein Kompilierzeittrick, um den Namen des aktuellen Mitglieds im Aufruf einer anderen Methode zuzuordnen. nameof ist auch ein Kompiliertrick, um etwas Ähnliches zu tun: Es nimmt die Zeichenfolgendarstellung eines Mitgliedes.

Welche zu verwenden, liegt an Ihnen. Ich würde sagen: Verwenden Sie CallerMemberName, wo Sie können, und nameof, wo Sie müssen. CallerMemberName ist noch mehr automatisiert als nameof, deshalb ist mir das lieber.

Beide haben die gleiche Leistung Implikation: nur zur Kompilierzeit braucht es einige zusätzliche Zeit, um den Code zu bewerten, aber das ist vernachlässigbar.

+0

So werden die Aufrufe in einfache Aufrufe mit Strings umgewandelt (also so, als würde ich Stringliterale anstelle von nameof verwenden?) – Mafii

+1

In der Tat. Es ist alles gleich. –

4

[CallerMemberName] und nameof sind nicht vollständig austauschbar. Manchmal brauchen Sie zuerst einen, manchmal einen zweiten, auch wenn wir über die gleiche Methode sprechen:

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; } 
} 
Verwandte Themen