【发布时间】:2014-07-06 14:18:41
【问题描述】:
我有一个 DataStructure 类,我希望它是不可变的。
通常,我会确保我的所有成员都被定义为readonly - Job Done。
但是其中一个成员是一个列表(整数),所以我需要确保List 不能被修改;所以我把它改成ReadOnlyCollection<T>。很好。
我还需要以某种方式对该集合进行排序 - 再次很好,我在通过 .AsReadOnly() 转换之前对列表进行了相应的排序。
到目前为止,一切都很好。
但最后一步是我想要 3 个不同的构造函数——每个构造函数都接受不同格式的原始数据。 现在我必须在每个构造函数中复制将列表转换为必要格式的代码。
如果我将其通用化为setList() 方法,则该变量不能是readonly,因为它是在非构造方法中分配的。现在我失去了一些不变性。
理想情况下,我可以通过某种方式声明 setList 方法只能从构造函数调用,因此允许编辑 readonly 成员,但我认为不存在。
我可以在 getter 等中创建包装所有内容,以便该类从外部是不可变的,但我更希望它从内部也是不可变的(特别是考虑到我可以实现这一点,我牺牲了 DRYness )
有人对我忘记的语言功能有什么聪明的想法可以解决这个问题吗?
【问题讨论】:
-
将成员标记为只读不会使集合不可变...
标签: c# constructor immutability readonly readonly-collection