INotifyPropertyChanged uygulanırken alternatiflere kıyasla [CallerMemberName] yavaş mı?


101

Uygulama için farklı yollarINotifyPropertyChanged öneren iyi makaleler var .

Aşağıdaki temel uygulamayı düşünün:

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
            }
        }
    }
}

Bunu bununla değiştirmek istiyorum:

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();
            }
        }
    }
}

Ancak bazen bu [CallerMemberName]özelliğin alternatiflere kıyasla zayıf performansa sahip olduğunu okudum . Bu doğru mu ve neden? Yansıma kullanıyor mu?

Yanıtlar:


206

Hayır, kullanımı[CallerMemberName] üst temel uygulamadan daha yavaş değildir .

Bunun nedeni, bu MSDN sayfasına göre ,

Arayan Bilgisi değerleri, derleme zamanında Orta Dil'e (IL) değişmez değerler olarak gönderilir

Herhangi bir IL disassembler ile ( ILSpy gibi ) şunları kontrol edebiliriz : özelliğin "SET" işleminin kodu tamamen aynı şekilde derlenir: CallerMemberName ile yeniden derlenmiş özellik

Yani burada Yansıma kullanılmaz.

(VS2013 ile derlenen örnek)


2
Aynı bağlantı, ancak Fransızca yerine İngilizce: msdn.microsoft.com/en-us/library/hh534540(v=vs.110).aspx
Mike de Klerk

2
@MikedeKlerk Bunu şimdi yaptığım halde neden doğrudan yanıtta düzenlemediğinizden emin değilim.
Ian Kemp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.