【发布时间】:2011-04-05 13:51:21
【问题描述】:
据说WPF的设计者已经把它做成了经济或者更高的性能。有人可以举例说明使 WPF 属性系统更经济的幕后情况吗?
【问题讨论】:
标签: c# wpf dependency-properties
据说WPF的设计者已经把它做成了经济或者更高的性能。有人可以举例说明使 WPF 属性系统更经济的幕后情况吗?
【问题讨论】:
标签: c# wpf dependency-properties
您可能指的是依赖属性比普通 CLR 属性“便宜”。
简而言之:
依赖属性是使用稀疏数据结构实现的,如果属性值设置在对象上,则仅为属性值分配内存。相比之下,标准 CLR 属性值作为字段存储在定义该属性的类的每个对象中,即使所有这些对象都将属性设置为其默认值。 p>
例如,如果我们有 100 个对象,每个对象具有 100 个 int 类型的 CLR 属性,那么即使所有这些对象都具有相同的默认值 (0),我们也会使用 10000 ints 的内存。
如果属性是依赖属性,我们根本不会使用任何额外的内存:WPF 不需要记住任何属性的值,因为它知道您没有更改默认值。
当然,上面的解释比较简单,并没有涵盖依赖属性相对于 CLR 属性的所有优点,但它应该充分解释了“DP 具有更高性能”的说法。
【讨论】:
WPF 控件的大多数“属性”实际上并不存在于控件本身上。他们没有向(基)类添加数十个(大部分未使用的)属性,而是选择添加一个“属性包”,一个仅包含实际设置的属性的字典。
作为奖励,它允许环境和注入属性。
【讨论】:
WPF 依赖属性系统在后台将实际属性值存储在优化的数据结构中。
与将属性值存储为字段相比,这有几个优点:
依赖属性系统通过不为每个对象实例存储属性的默认值,它可以节省内存分配(基本上,如果属性具有目标对象的默认值,则不会为该值分配空间。这与具有始终存储值的支持字段的属性相反,并且始终为对象保留内存)。
依赖属性系统可以具有优化的事件机制,避免在每个对象的基础上存储处理程序引用(如使用基于支持字段的事件),这意味着可以节省更多空间。
这样的系统当然会有一点开销。属性访问不像使用普通属性那样轻量级,但 WPF 团队已经决定,由于内存使用量较低,因此开销较小。
【讨论】:
除了其他答案:
WPF 中的依赖属性支持属性值继承。使用普通的 CLR 属性,在不修改子对象的情况下将值下推到任何“子”对象要困难得多。这显然可以通过附加方法和静态映射来完成,但可能不是一个非常通用的解决方案。虽然继承属性有一些开销,但它们在传递值方面相当有效。
【讨论】: