相关疑难解决方法(0)

为什么Microsoft建议使用具有可变值的只读字段?

开发类库设计指南中,Microsoft说:

不要将可变类型的实例分配给只读字段.

使用可变类型创建的对象可以在创建后进行修改.例如,数组和大多数集合是可变类型,而Int32,Uri和String是不可变类型.对于包含可变引用类型的字段,只读修饰符可防止字段值被覆盖但不保护可变类型不被修改.

这简单地重述了readonly的行为,但没有解释为什么使用readonly是不好的.其含义似乎是许多人不理解"只读"的含义,并错误地认为只读字段是不可改变的.实际上,它建议使用"readonly"作为代码文档,指示深层不变性 - 尽管编译器无法强制执行此操作 - 并且禁止将其用于其正常功能:确保字段的值在之后不会发生变化对象已经构建.

我对使用"readonly"来表示除编译器理解的正常含义之外的其他内容感到不安.我觉得它鼓励人们误解"只读"的含义,并且期望它意味着代码作者可能不想要的东西.我觉得它排除了在可能有用的地方使用它 - 例如,表明两个可变对象之间的某些关系在其中一个对象的生命周期内保持不变.假设读者不理解"只读"的含义这一概念似乎与微软的其他建议相矛盾,例如FxCop的"不要初始化不必要"规则,该规则假定您的代码的读者是该语言的专家并且应该知道(例如)bool字段被自动初始化为false,并且阻止您提供显示"是,这已被有意识地设置为false的冗余;我不会忘记初始化它".

那么,首先,为什么Microsoft建议不要使用readonly来引用可变类型?我也有兴趣知道:

  • 您是否在所有代码中都遵循此设计指南?
  • 当你在一段你没写过的代码中看到"readonly"时,你有什么期望?

c# immutability

38
推荐指数
3
解决办法
2598
查看次数

标签 统计

c# ×1

immutability ×1