为什么依赖属性被声明为静态只读的?

12

我清楚为什么依赖属性是静态的,但我仍然想知道为什么在声明依赖属性时需要使用只读关键字。


只需看一下这个链接:https://dev59.com/pXA75IYBdhLWcg3w_umD - Kishore Kumar
3个回答

4

在概念上,依赖属性是依赖对象所拥有的并且不依赖于您使用该属性的时间。就像CLR属性一样,如果您询问此对象是否具有“Total”属性,则现在它不能是double类型,但以后可以是int类型。因此,如果我们可以,我们会将依赖属性设置为const,但我们无法这样做,因此readonly是次佳选择。

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

  • 它通知代码读者值不会改变
  • 防止作者意外更改值
  • 协助编译器,使其受益于知道什么时候不会更改事物

1
是的,我明白了。但是如果我将其声明为非只读,并且出于某种原因我确实想在运行时动态更改此属性,这是否可能?或者对于这种情况,有更好的解决方案吗? - zinking
这里的readonly只与以Property结尾的依赖属性标识符有关,这并不意味着依赖属性的值不能更改。仅此标识符是不可更改的。这个依赖属性标识符被用作DependencyObject类中键的一部分,以获取和设置属性的实际值。 - Sheridan

2

因为它明确表明,该属性的值在初始化后无法更改。


1

希望这可以帮到你:Silverlight.net论坛:DependencyProperty - public static readonly?

引用一下:

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

公共的,以便所有属性系统调用,包括跨程序集访问它。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接