Чи повільний [CallerMemberName] порівняно з альтернативами при впровадженні INotifyPropertyChanged?


98

Є хороші статті, які пропонують різні способи реалізаціїINotifyPropertyChanged .

Розглянемо наступну базову реалізацію:

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

Я хотів би замінити його на цей:

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

Але іноді я читаю, що [CallerMemberName]атрибут має погані показники порівняно з альтернативами. Це правда і чому? Чи використовує воно рефлексію?

Відповіді:


200

Ні, використання [CallerMemberName]не повільніше, ніж верхня основна реалізація.

Це тому, що відповідно до цієї сторінки MSDN ,

Значення інформації про виклику видаються у прямому значенні в проміжний мову (IL) під час компіляції

Ми можемо перевірити, що з будь-яким розбиральником IL (наприклад, ILSpy ): код для операції властивості "SET" складається точно так само: Декомпільовано властивість з CallerMemberName

Тож ніякої користі відбиття тут немає.

(зразок, складений з VS2013)


2
Це ж посилання, але англійською мовою замість французької: msdn.microsoft.com/en-us/library/hh534540(v=vs.110).aspx
Майк де Клерк

2
@MikedeKlerk Не впевнений, чому ти не відредагував це безпосередньо у відповідь, хоча я зараз це зробив.
Ян Кемп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.