Ist [CallerMemberName] bei der Implementierung von INotifyPropertyChanged im Vergleich zu Alternativen langsam?

98

Es gibt gute Artikel, die verschiedene Arten der ImplementierungINotifyPropertyChanged vorschlagen .

Betrachten Sie die folgende grundlegende Implementierung:

class BasicClass : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void FirePropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

    private int sampleIntField;

    public int SampleIntProperty
    {
        get { return sampleIntField; }
        set
        {
            if (value != sampleIntField)
            {
                sampleIntField = value;
                FirePropertyChanged("SampleIntProperty"); // ouch ! magic string here
            }
        }
    }
}

Ich möchte es durch dieses ersetzen:

using System.Runtime.CompilerServices;

class BetterClass : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    // Check the attribute in the following line :
    private void FirePropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

    private int sampleIntField;

    public int SampleIntProperty
    {
        get { return sampleIntField; }
        set
        {
            if (value != sampleIntField)
            {
                sampleIntField = value;
                // no "magic string" in the following line :
                FirePropertyChanged();
            }
        }
    }
}

Aber manchmal habe ich gelesen, dass das [CallerMemberName]Attribut im Vergleich zu Alternativen schlechte Leistungen aufweist. Ist das wahr und warum? Verwendet es Reflexion?

JYL
quelle

Antworten:

200

Nein, die Verwendung von [CallerMemberName]ist nicht langsamer als die obere Basisimplementierung.

Dies liegt daran, nach dieser MSDN - Seite ,

Anruferinfo-Werte werden zur Kompilierungszeit als Literale in die Intermediate Language (IL) ausgegeben

Wir können dies mit jedem IL-Disassembler (wie ILSpy ) überprüfen : Der Code für die "SET" -Operation der Eigenschaft wird genauso kompiliert: Dekompilierte Eigenschaft mit CallerMemberName

Also keine Verwendung von Reflection hier.

(Beispiel zusammengestellt mit VS2013)

JYL
quelle
2
Der gleiche Link, aber auf Englisch statt Französisch: msdn.microsoft.com/en-us/library/hh534540(v=vs.110).aspx
Mike de Klerk
2
@MikedeKlerk Ich bin mir nicht sicher, warum Sie es nicht direkt in der Antwort bearbeitet haben, obwohl ich es jetzt getan habe.
Ian Kemp