与实现INotifyPropertyChanged时的替代方法相比,[CallerMemberName]是否较慢?


98

有好文章提出了不同的实现方法INotifyPropertyChanged

考虑以下基本实现:

class BasicClass : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void FirePropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

    private int sampleIntField;

    public int SampleIntProperty
    {
        get { return sampleIntField; }
        set
        {
            if (value != sampleIntField)
            {
                sampleIntField = value;
                FirePropertyChanged("SampleIntProperty"); // ouch ! magic string here
            }
        }
    }
}

我想用这个替换它:

using System.Runtime.CompilerServices;

class BetterClass : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    // Check the attribute in the following line :
    private void FirePropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

    private int sampleIntField;

    public int SampleIntProperty
    {
        get { return sampleIntField; }
        set
        {
            if (value != sampleIntField)
            {
                sampleIntField = value;
                // no "magic string" in the following line :
                FirePropertyChanged();
            }
        }
    }
}

但是有时候我读到该[CallerMemberName]属性与替代属性相比性能较差。那是真的,为什么?它使用反射吗?

Answers:


200

不,使用[CallerMemberName]它并不比上层基本实现

这是因为根据此MSDN页面

在编译时,呼叫者信息值将作为文字发送到中间语言(IL)中

我们可以使用任何IL反汇编程序(例如ILSpy)进行检查:属性的“ SET”操作的代码完全相同地编译: 具有CallerMemberName的反编译属性

因此,这里不使用反射。

(使用VS2013编译的示例)


2
相同的链接,但是用英语而不是法语:msdn.microsoft.com/en-us/library/hh534540(v=vs.110).aspx
Mike de Klerk

2
@MikedeKlerk不知道为什么您没有直接将其编辑为答案,尽管我现在已经这样做了。
伊恩·肯普
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.