Должен ли я предоставить метод с именем члена с 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; }
}