【问题标题】:Should I provide a method with a member name with nameof, or should I depend on CallerMemberName to do it for me?我应该提供一个带有 nameof 成员名称的方法,还是应该依靠 CallerMemberName 为我做这件事?
【发布时间】:2016-10-22 21:42:15
【问题描述】:

CallerMemberName是如何实现的?

我明白它的作用——它允许我们将魔术字符串排除在代码之外——但它应该在nameof 上使用吗?还有什么性能更高?

有什么区别/CallerMemberName 究竟是如何工作的?

【问题讨论】:

  • 它们用于两个不相关的场景。 CallerMemberName 告诉你谁在给你打电话,nameof 告诉你你在给谁打电话。
  • 我认为问题是:我应该提供一个使用nameof 的成员名称的方法,还是应该依靠CallerMemberName 为我做这件事?
  • @PatrickHofman 真实,编辑不当

标签: c# reflection nameof callermembername


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    CallerMemberName 是一种编译时技巧,用于将当前成员的名称放在对另一个方法的调用中。 nameof 也是一个编译时技巧来做类似的事情:它采用成员的字符串表示。

    使用哪个取决于您。我想说:尽可能使用CallerMemberName,必须使用nameofCallerMemberNamenameof 更加自动化,所以我更喜欢那个。

    两者具有相同的性能含义:仅在编译时需要一些额外的时间来评估代码,但这可以忽略不计。

    【讨论】:

    • 所以调用变成了带有字符串的简单调用(就像我使用字符串文字而不是 nameof 一样?)
    • 确实如此。都是一样的。
    猜你喜欢
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多