INotifyPropertyChanged vs. DependencyProperty
INotifyPropertyChanged vs. DependencyProperty
这个问题已经有了答案:
我需要监控属性的变化。从性能和内存使用的角度来看,实现INotifyPropertyChanged
还是使用DependencyProperty
哪种方法更好呢?
注意:是的,我已经阅读了其他问题INotifyPropertyChanged vs. DependencyProperty in ViewModel。
没关系,我在以下问题中找到了我正在寻找的答案:question。
我将转载 “LBugnion” 的答案(所有的功劳都归给他)以方便您:
实现INotifyPropertyChanged与使用DependencyObjects(我将其缩写为DO使其更加轻松)和DependencyProperties(DPs)相比有许多优点:
- 它更轻量级
- 允许您更自由地对您的对象进行建模
- 很容易进行序列化
- 您可以在需要时提高事件,这在某些情况下非常有用,例如当您想将多次更改捆绑在一个UI操作中,或者当您需要触发事件时即使数据未更改(以强制重绘时...)
另一方面,在WPF中继承DOs具有以下优点:
- 特别是适合初学者的实现更加容易。
- 您获得回调机制(几乎)免费,允许您在属性值更改时得到通知
- 您获得协作机制,可以定义属性的最大、最小和现有值的规则。
还有其他考虑因素,但这些是主要的。
我认为人们普遍认为DPs非常适合控件(并且即使在Silverlight中,您也可以实现具有自定义DP的CustomControl),但是对于数据对象,您最好实现INotifyPropertyChanged。
希望有所帮助,Laurent
内存使用:INotifyPropertyChanged是一个接口,所以几乎没有内存开销。 几乎没有开销是因为我假设你将编写一个OnPropertyChanged方法以及其他类中的一些事件处理程序(除非你只是想绑定到WPF),所以会有一些代码开销。
性能:DependancyProperties在内部有很多工作要做。 除非你编写了最不兼容性的OnPropertyChanged方法,否则我打赌INotifyPropertyChanged也会成为性能赢家。
除非你有一个明确的理由想要/需要DP提供的行为,否则我会选择INotifyPropertyChanged。
更新
如评论所述,绑定性能对于DP来说稍微快一些(快15-20%,但只有不到50ms的1000个绑定的差异),这是由于执行查找/连接直接属性所需的反射量。这在技术上与更新数据绑定UI元素的性能不同,这是我的评论所针对的。但这并不意味着我的赌注仍然是正确的。因此,经过一些示例和大量的.NET Reflector挖掘,看起来…没有定论。两条路径在内部都有大量的工作要做,我无法得到任何示例来显示更新性能上的明确差异。
我仍然坚持使用INotifyPropertyChanged,除非我有DP的具体需求,但至少这是一个有趣的练习,可以深入了解WPF核心。 🙂