Должен ли я предоставить метод с именем члена с nameof, или я должен полагаться на CallerMemberName, чтобы сделать это для меня?

Как реализовано CallerMemberName?

Я получаю то, что он делает - это позволяет нам не допускать магических строк в нашем коде - но если его использовать более nameof а что более производительно?

В чем разница / как CallerMemberName точно работает?

2 ответа

Решение

CallerMemberName трюк времени компиляции, чтобы поместить имя текущего члена в вызове другого метода. nameof это также трюк времени компиляции, чтобы сделать что-то подобное: он принимает строковое представление члена.

Что использовать - решать только вам. Я бы сказал: использовать CallerMemberName где вы можете, и nameof где ты должен. CallerMemberName еще более автоматизирован, чем nameofВот почему я предпочитаю это.

Оба имеют одинаковое влияние на производительность: только во время компиляции требуется некоторое дополнительное время для оценки кода, но это пренебрежимо мало.

[CallerMemberName] а также nameof не являются полностью взаимозаменяемыми. Иногда вам нужен первый, иногда второй, даже если мы говорим об одном и том же методе:

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; }
}
Другие вопросы по тегам