WPF财产系统如何经济?

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

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

简而言之:

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

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

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

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

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

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

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

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

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

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

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

除了其他答案:

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