如何实现callermembername?
我得到了它的作用 - 它使我们能够将魔术字符串远离代码 - 但是应该在nameof
上使用它,还有什么更有性能?
callermembername有什么区别/如何工作?
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; }
}