在实现 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
尽管没有在表格视图中实现尾随滑动动作,但删除按钮会在滑动时自动实现