为什么需要依赖属性?

42

为什么Microsoft采用了依赖属性和依赖对象的方式,而不是使用反射或属性?


那么依赖属性的默认值存储在哪里?它们也会占用内存,对吧?另外,如果我们更改文本框控件的“Text”dp,则更改后的值将仅存储在该对象(特定文本框)的Hashtable中?如果是这种情况,那么默认值+更改值..内存翻倍..呼。让我知道你的看法,问候Rakesh,www.qtricks.com - user1078849
@Rajesh Kumar:默认值被静态地存储。因此,尽管所有实例都使用同一个值,但占用空间减少了。 - user879355
2个回答

68

这帮助我理解了其中的道理:

主要区别在于,普通 .NET 属性的值是从你的类中的私有成员直接读取的,而 DependencyProperty 的值是在调用从 DependencyObject 继承的 GetValue() 方法时动态解析的

当你设置依赖属性的值时,它并不存储在对象的字段中,而是存储在基类 DependencyObject 提供的键值字典中。条目的键是属性的名称,值是你想要设置的值。

依赖属性的优点如下:

减少内存占用

当你考虑到 UI 控件的超过 90% 的属性通常保持其初始值时,为每个属性存储一个字段是一种巨大的浪费。依赖属性通过仅在实例中存储修改后的属性来解决这些问题。默认值仅在依赖属性中存储一次。

值继承

当你访问依赖属性时,使用值解析策略解析该值。如果没有设置本地值,则依赖属性向上导航逻辑树,直到找到一个值。当你在根元素上设置 FontSize 时,除非你覆盖该值,否则它适用于下面的所有文本块。

更改通知

依赖属性具有内置的更改通知机制。通过在属性元数据中注册回调,当属性的值更改时,你会收到通知。这也被数据绑定使用。

来自:WPF教程


1
感谢您的出色回答。即使我已经阅读了所有关于DP的MSDN文档,直到我看到您的回复之前,我仍然有些困惑。 - Mike Chamberlain

8

依赖属性解决了与反射和属性不同的使用场景。

依赖属性提供了一个单一、一致的API,用于处理标准属性无法处理的事情。

  • 它们允许类提供大量属性而没有额外开销(因为它们只在使用时静态创建,而不是每个类都要创建一次)。对于
  • 依赖属性系统以与标准依赖属性相同的方式处理附加属性
  • 依赖属性提供了一个干净的API,用于更改跟踪和验证
  • 依赖属性提供了属性值继承
  • 依赖属性在数据绑定时提供巨大的性能优势

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接