【问题标题】:How is the WPF property system economical?WPF 属性系统如何经济?
【发布时间】:2011-04-05 13:51:21
【问题描述】:

据说WPF的设计者已经把它做成了经济或者更高的性能。有人可以举例说明使 WPF 属性系统更经济的幕后情况吗?

【问题讨论】:

    标签: c# wpf dependency-properties


    【解决方案1】:

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

    简而言之:

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

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

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

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

    【讨论】:

    • 优秀的答案。
    【解决方案2】:

    WPF 控件的大多数“属性”实际上并不存在于控件本身上。他们没有向(基)类添加数十个(大部分未使用的)属性,而是选择添加一个“属性包”,一个仅包含实际设置的属性的字典。

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        【解决方案4】:

        除了其他答案:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-03
          • 1970-01-01
          • 1970-01-01
          • 2011-07-08
          • 2021-03-09
          • 1970-01-01
          • 2012-11-25
          • 1970-01-01
          相关资源
          最近更新 更多