为什么.Net WPF DependencyProperties必须是类的静态成员

为什么.Net WPF DependencyProperties必须是类的静态成员,.net,wpf,.net,Wpf,现在学习WPF。今天发现了一些新的.Net依赖项属性。他们带来的是 支持回调(验证、更改等) 财产继承 附加属性 除其他外 但我这里的问题是,为什么它们需要在包含类中声明为静态?建议的方法是为它们添加实例“wrapper”属性。为什么? 编辑: @Matt,但这是否也要求属性值也在实例之间共享?当然,除非它是派生值?我认为这一要求背后有两个原因: 同一DP不能注册两次。为了遵守此约束,您应该使用静态变量,它将只初始化一次,因此您将只注册一次DP 应该在创建任何类(使用该DB)实例之前注册DP

现在学习WPF。今天发现了一些新的.Net依赖项属性。他们带来的是

  • 支持回调(验证、更改等)
  • 财产继承
  • 附加属性
除其他外

但我这里的问题是,为什么它们需要在包含类中声明为静态?建议的方法是为它们添加实例“wrapper”属性。为什么?

编辑:
@Matt,但这是否也要求属性值也在实例之间共享?当然,除非它是派生值?

我认为这一要求背后有两个原因:

  • 同一DP不能注册两次。为了遵守此约束,您应该使用静态变量,它将只初始化一次,因此您将只注册一次DP
  • 应该在创建任何类(使用该DB)实例之前注册DP

  • 我认为您需要依赖属性的静态实例的原因实际上只是因为它们是这样设计的。静态位保存所有的属性元数据——它的默认值、所有者类型(如果它是一个附加属性,则很方便)等等,以及它在更改时的回调方法——诸如此类。跨类的所有实例而不是每个实例静态存储这些内容是有意义的。

    依赖项属性是静态的,因为WPF中有一个关键优化:WPF中的许多控件都有几十个(如果不是几百个)属性。这些类中的大多数属性都设置为默认值。如果DP是实例属性,则需要为您创建的每个对象中的每个属性分配内存。由于DP是静态的,WPF可以更有效地管理每个属性的内存使用

    您应该为您注册的任何DP提供默认值的原因是,当属性设置为默认值时,无论您创建了多少个包含该属性的对象,WPF都会注意不为属性分配额外内存