【问题标题】:Why Dependency property are declared as static readonly?为什么依赖属性被声明为静态只读?
【发布时间】:2011-04-10 05:23:21
【问题描述】:

我很清楚为什么依赖属性是静态的,而我仍然想知道的问题是为什么我们需要在声明依赖属性时使用 Readonly 关键字。

【问题讨论】:

标签: wpf dependency-properties


【解决方案1】:

从概念上讲,依赖属性是依赖对象仅具有的东西,它不依赖于您何时使用该属性。就像 CLR 属性一样,如果你问这个对象是否有 Total 属性,你知道它现在不能是 double,而是以后是 int。因此,如果可以的话,我们会创建依赖属性 const,但我们不能,所以 readonly 是次优的。

使用readonly关键字至少有三种效果:

  • 它通知代码的读者该值不会改变
  • 它可以防止作者意外更改值
  • 它协助编译器,这得益于知道什么时候事情不会改变

【讨论】:

  • 是的,明白了。但是如果我声明它不是只读的,并且出于某种原因我确实想在运行时动态更改此属性,这可能吗?还是对于这种情况有更好的解决方案?
  • 这里的readonly 仅与以单词Property 结尾的依赖属性标识符有关。这并不意味着依赖属性的值不能改变。只有这个标识符不能改变。此依赖属性标识符用作 DependencyObject 类中键的一部分,以获取和设置属性的实际值。
【解决方案2】:

因为很明显,这个属性的值在初始化后不能改变。

【讨论】:

    【解决方案3】:

    希望这会有所帮助:Silverlight.net forums: DependencyProperty - public static readonly?

    引用:

    “public static readonly”是从 Register 调用返回的字段。该字段是属性的标识符。您只需要该标识符,以便 Silverlight 属性系统知道要做什么,并且您可以在定义依赖项属性的 CLR“包装器”时自己使用属性系统。有了包装器后,该属性的所有进一步使用都可以像使用典型属性一样使用它。

    公开,以便包括跨汇编在内的所有属性系统调用都可以访问它。

    静态和只读,因为这不是一个应该改变的定义;属性系统需要得到一致的结果。

    在附加属性的情况下,您希望有一个“所有者”类。所有者类必须是调用 RegisterAttached 的类,并且还必须定义静态访问器方法(Get* 和 Set*),以便 XAML 解析器知道当您尝试在 DependencyObject 实例上设置附加属性时要执行的操作。所以有点不同,因为对于附加属性,通常没有“包装器”,任何代码访问都只使用 Get* 和 Set* 访问器。

    【讨论】:

      猜你喜欢
      • 2015-11-21
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多