C# WPF房地产系统如何经济?

C# WPF房地产系统如何经济?,c#,wpf,dependency-properties,C#,Wpf,Dependency Properties,据说WPF的设计者已经使其经济或性能更高。有人能举例说明在引擎盖下发生了什么使WPF属性系统更经济吗?WPF控件的大多数“属性”实际上并不存在于控件本身。他们没有向(基类)类添加几十个(大部分未使用的)属性,而是选择添加一个“属性包”,一个只包含实际设置的属性的字典 作为奖励,它允许环境和注入属性 您可能指的是依赖项属性比普通CLR属性“便宜”这一事实 简言之: 依赖项属性是使用稀疏数据结构实现的,如果属性值是在对象上设置的,则稀疏数据结构仅为属性值分配内存。相反,标准CLR属性值作为字段存储在

据说WPF的设计者已经使其经济或性能更高。有人能举例说明在引擎盖下发生了什么使WPF属性系统更经济吗?

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


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

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

简言之:

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

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

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


当然,上面的解释过于简单,没有涵盖依赖属性相对于CLR属性的所有优势,但它应该充分解释“DPs具有更高的性能”语句。

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

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

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

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


这种系统的开销当然很小。属性访问不像使用普通属性那样轻量级,但WPF团队认为,由于内存使用率较低,这一小开销远远超过了它所能弥补的。

除了其他答案外:


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

回答得很好。