建议对接口使用Readonly?

时间:2014-07-03 14:57:07

标签: c# interface

创建接口readonly是否有意义?

使用Resharper 8.0时,我得到了以下建议,我不确定这对我有什么帮助。

enter image description here

我从研究中发现了什么(目前尚不清楚它如何对待界面):

  • 它只是一个检查,以确保一旦完全构造对象,该字段就不能指向新值。
  • 此关键字的真正优势在于生成不可变数据结构。根据定义,不可变数据结构一旦构造就不能改变
  • readonly关键字用于将成员变量声明为常量,但允许在运行时计算该值。
  • 如果您不想重新编译引用该常量的外部DLL(因为它在编译时被替换),请使用readonly

引用:What are the benefits to marking a field as `readonly` in C#?

2 个答案:

答案 0 :(得分:2)

这个问题根本不重要。首先,正如@CodeCaster所提到的,它与接口无关,而ReSharper可能会对所有领域都这样做。

将readonly放在私有字段上的假设值是指示未来的维护者,他们可能希望在编写类时更改您不考虑更改该字段的字段的值。这意味着他们在改变时必须考虑该领域的所有用途。这在实践中并不是什么大不了的事情,如果你不打扰它并在你的代码中加入它,你就可以做到这一点。另一方面,如果您不希望为所有代码执行此操作,则只有在您特别考虑并确定此字段不应更改或某些内容会中断时,才能更好地使用readonly。这是一个违约问题。

答案 1 :(得分:0)

识别两种不同类型的基类是很重要的,这些基类会有一个基类本身永远不会在构造函数之外写入的字段:

  1. 表示不可变值的类。在许多情况下,这些的基本字段应该被标记为只读,否则基础应该为派生类提供一种限制手段来编写它们(某些场景可能需要派生类在基类实例之间写入字段构建,以及它暴露于外部世界的时间,但如果有必要,基类应该明确地为此设计。

  2. 摘要"可读"具有可变和不可变衍生物的基类。在这种情况下,基类类字段绝对不应该是只读的,因为派生类可能合法地需要编写它们。

  3. 在不知道哪种情况适用的情况下,很难说哪种字段合适。如果一个人试图产生第二种类,另一种选择是抽象类不具有任何字段,而是将其属性getter链接到虚方法。如果需要编写一个不直接保存数据的派生类,而是封装一个可读的视图"那么这种情况可能会有所帮助。存储在别处的数据。