WPF财产系统如何经济?

时间:2011-04-05 13:51:21

标签: c# wpf dependency-properties

据说WPF的设计者已经使其经济或更高性能。有人可以解释一下在WPF属性系统更经济的情况下会发生什么事情的例子吗?

4 个答案:

答案 0 :(得分:13)

您可能指的是依赖属性比普通CLR属性“更便宜”这一事实。

用几句话说:

依赖属性是使用稀疏数据结构实现的,只有在对象上设置属性值时,才会为其分配内存。相反,标准CLR属性值作为字段存储在定义属性的类的每个对象中,即使所有这些对象都将属性设置为其默认值。

因此,例如,如果我们有100个对象,每个对象具有100个类型为int的CLR属性,那么即使所有这些属性具有相同的默认值,我们也会使用10000 int个内存( 0)。

如果属性是依赖属性,我们根本不会使用任何额外的内存:WPF不需要记住任何属性的值,因为它知道你没有从默认值中更改它。

当然上面的内容相当简单,并没有涵盖依赖属性优于CLR属性的所有优点,但它应该充分说明“DP具有更高性能”的说法。

答案 1 :(得分:6)

WPF控件的大多数'属性'实际上并不存在于Control本身上。他们选择添加一个“属性包”,而不是将几十个(大多数未使用的)属性添加到(base-)类,而是仅包含实际设置的属性的Dictionary。

作为奖励,它允许环境和注入属性。

答案 2 :(得分:2)

WPF依赖项属性系统将实际属性值存储在幕后的优化数据结构中。

与将字段值存储为字段相比,这有几个优点:

  • 依赖属性系统通过NOT存储每个对象实例的属性的默认值,它可以节省大量内存(基本上,如果属性具有目标对象的默认值,则不为该值分配空间。反对具有支持字段的属性,其中值始终存储,并且始终为对象保留内存。)

  • 依赖属性系统可以具有优化的事件机制,避免在每个对象的基础上存储处理程序引用(比如使用基于支持字段的事件),这意味着可以节省更多空间。

这样的系统当然有很小的开销。属性访问不像使用普通属性那样轻量级,但是由于内存使用率较低,WPF团队已经确定了较小的开销而不是使用它。

答案 3 :(得分:0)

除了其他答案:

WPF中的依赖项属性支持属性值继承。使用正常的CLR属性,在不修改子对象的情况下将值推送到任何“子”对象要困难得多。显然可以使用附加方法和静态映射来完成,但可能不是一个非常通用的解决方案。虽然继承属性有一些开销,但它们在传递值方面相当有效。