我应该提供一个带有 nameof 成员名称的方法,还是应该依赖 CallerMemberName 来为我做这件事?
Should I provide a method with a member name with nameof, or should I depend on CallerMemberName to do it for me?
CallerMemberName是如何实现的?
我明白它的作用 - 它允许我们将魔术字符串排除在我们的代码之外 - 但它应该在 nameof
上使用吗?什么性能更好?
difference/how 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; }
}
CallerMemberName是如何实现的?
我明白它的作用 - 它允许我们将魔术字符串排除在我们的代码之外 - 但它应该在 nameof
上使用吗?什么性能更好?
difference/how 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; }
}