现在学习WPF。今天用 .Net 依赖属性发现了一些新东西。他们带来的是
- 支持回调(验证、更改等)
- 财产继承
- 附加属性
其中。
但我的问题是为什么它们需要在包含类中声明为静态?推荐的方法是为它们添加实例“包装器”属性。为什么 ?
编辑:@Matt,但这是否也要求属性值也在实例之间共享 - 当然除非它是派生值?
由于 WPF 中的关键优化,依赖属性是静态的:WPF 中的许多控件具有数十个(如果不是数百个)属性。这些类中的大多数属性都设置为其默认值。如果 DP 是实例属性,则需要为您创建的每个对象中的每个属性分配内存。由于 DP 是静态的,因此 WPF 可以自由地更有效地管理每个属性的内存使用情况。
您应该为您注册的任何 DP 提供默认值的原因是,当您的属性设置为默认值时,无论您创建多少包含该属性的对象,WPF 都会注意不要为您的属性分配额外的内存。
我认为您需要依赖属性的静态实例的原因实际上只是因为它们就是这样设计的。静态位包含所有属性元数据——它的默认值、它的所有者类型(如果它是一个附加属性则很方便)等、它改变时的回调方法——诸如此类。在类的所有实例而不是每个实例中静态存储这些东西是有意义的。
我看到该要求背后的两个原因: