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

有好的文章建议 实现 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]属性与其他属性相比性能较差。是真的吗,为什么?它使用反射吗?

34499 次浏览

不,使用 [CallerMemberName]并不慢比较高的基本实现。

这是因为,根据 这个 MSDN 页面,

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

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

So no use of Reflection here.

(使用 VS2013编制的样本)