2

CallerMemberName是如何实现的?

我明白了它的作用——它允许我们将魔法字符串排除在代码之外——但它应该被过度使用nameof吗?什么更高效?

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

4

2 回答 2

4

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

使用哪个取决于您。我会说:CallerMemberName在你可以使用的地方,以及nameof你必须使用的地方。CallerMemberName比 更加自动化nameof,所以这就是我更喜欢那个的原因。

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

于 2016-06-21T11:10:40.810 回答
4

[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; }
}
于 2016-06-21T11:25:27.583 回答