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属性有一些开销,但它们在传递值方面相当有效。