为什么Microsoft采用了依赖属性和依赖对象的方式,而不是使用反射或属性?
为什么Microsoft采用了依赖属性和依赖对象的方式,而不是使用反射或属性?
这帮助我理解了其中的道理:
主要区别在于,普通 .NET 属性的值是从你的类中的私有成员直接读取的,而 DependencyProperty 的值是在调用从 DependencyObject 继承的 GetValue() 方法时动态解析的。
当你设置依赖属性的值时,它并不存储在对象的字段中,而是存储在基类 DependencyObject 提供的键值字典中。条目的键是属性的名称,值是你想要设置的值。
依赖属性的优点如下:
减少内存占用
当你考虑到 UI 控件的超过 90% 的属性通常保持其初始值时,为每个属性存储一个字段是一种巨大的浪费。依赖属性通过仅在实例中存储修改后的属性来解决这些问题。默认值仅在依赖属性中存储一次。
值继承
当你访问依赖属性时,使用值解析策略解析该值。如果没有设置本地值,则依赖属性向上导航逻辑树,直到找到一个值。当你在根元素上设置 FontSize 时,除非你覆盖该值,否则它适用于下面的所有文本块。
更改通知
依赖属性具有内置的更改通知机制。通过在属性元数据中注册回调,当属性的值更改时,你会收到通知。这也被数据绑定使用。
来自:WPF教程。