C#的一般指导原则是始终在公共领域使用属性。这很有意义-通过公开一个字段,您将公开许多实现细节。通过一个属性,您可以封装该详细信息,从而使其在使用代码中不会被隐藏,并且实现更改与接口更改脱钩。
但是,我想知道在处理readonly
关键字时有时是否存在此规则的有效例外。通过将此关键字应用于公共领域,可以额外保证:不变性。这不仅是实现细节,不变性是用户可能感兴趣的东西。使用readonly
字段使其成为公共合同的一部分,并且在将来的更改或继承中也不会破坏,而不必修改公共接口。那是财产所不能提供的。
那么,readonly
在某些情况下,确保不变性是在属性上选择字段的合法理由吗?
(为澄清起见,我当然不是说您应该总是仅因为该字段恰好是不可变的而做出此选择,只有当该字段作为类设计的一部分是有意义的并且打算将不可变性包括在其合同中时才使用。我最感兴趣的答案是侧重于此是否合理,而不是在某些情况下不合理(例如,当您需要将该成员放在interface
或希望进行延迟加载时)。