实现INotifyPropertyChanged时,比替代方法慢吗?

有很好的文章提出了实现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 } } } } 

我想用这个replace它:

 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]属性与其他选项相比性能较差。 这是真的,为什么? 它使用reflection吗?

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

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

调用者信息值在编译时以文字forms发送到中间语言(IL)中

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

所以在这里没有使用reflection。

(用VS2013编译的样本)