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?

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)


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.