实现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”操作的代码编译方式完全相同:
所以在这里没有使用reflection。
(用VS2013编译的样本)