在实现 INotifyPropertyChanged 时,[CallerMemberName] 与替代方案相比是不是慢?

Posted

技术标签:

【中文标题】在实现 INotifyPropertyChanged 时,[CallerMemberName] 与替代方案相比是不是慢?【英文标题】:Is [CallerMemberName] slow compared to alternatives when implementing INotifyPropertyChanged?在实现 INotifyPropertyChanged 时,[CallerMemberName] 与替代方案相比是否慢? 【发布时间】:2014-04-30 02:39:45 【问题描述】:

有好文章推荐different ways for implementing 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] 属性与替代品相比性能较差。这是真的吗?为什么?它使用反射吗?

【问题讨论】:

【参考方案1】:

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

这是因为,根据this MSDN page,

调用者信息值作为文字发送到中间体 编译时的语言 (IL)

我们可以使用任何 IL 反汇编程序(如 ILSpy)检查:该属性的“SET”操作的代码以完全相同的方式编译:

所以这里没有使用反射。

(用VS2013编译的示例)

【讨论】:

同一个链接,但用英语而不是法语:msdn.microsoft.com/en-us/library/hh534540(v=vs.110).aspx @MikedeKlerk 不知道您为什么不直接将其编辑到答案中,尽管我现在已经这样做了。

以上是关于在实现 INotifyPropertyChanged 时,[CallerMemberName] 与替代方案相比是不是慢?的主要内容,如果未能解决你的问题,请参考以下文章

Dapper 啥时候“实现”? Like Entity 在 ToList() 实现

@Service注解是标注在实现类上的的接口中添加注解还是在实现类impl

是否可以在接口中实现本机方法?

尽管没有在表格视图中实现尾随滑动动作,但删除按钮会在滑动时自动实现

实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作

具有多个接口实现的 Spring Autowire Bean,在方法中定义实现