我目前正在学习 C#,并且我有一个包含 ISet 的类的情况。我不希望客户直接修改这个集合,大多数客户只添加和删除,我通过我的类提供访问器来做到这一点。
但是,我有一个客户希望更多地了解这一套及其内容。我真的不想用这个客户端的很多方法来混淆包装类本身,所以我希望能够以不可变的方式返回集合本身。
我发现我不能——嗯,不是真的。我似乎唯一的选择是:
- 返回一个 IEnumerable(否:限制性功能);
- ReadOnlyCollection (No: It's a LIST);
- 返回一个副本(否:恕我直言,错误的形式,允许客户端修改返回的集合,可能不知道它不会改变真实对象,而且它有性能开销);
- 实现我自己的 ReadOnlySet(否:需要从 ISet 派生,因此意味着我需要实现 mutators,可能会触发异常,我宁愿编译时错误 - 而不是运行时)。
我错过了什么吗?我是不是太不讲理了?在我的包装器上提供全套访问器是我唯一的选择吗?我为绝大多数客户保持包装清洁的初衷是否不正确?
所以两个问题:
为什么没有标准的 C# 不可变 Collection 接口?这似乎是一个相当合理的要求?
为什么 ReadOnlyCollection 实际上是一个 ReadOnlyList 时却令人讨厌地称为 ReadOnlyCollection?我打算硬着头皮使用它,直到我发现它是一个列表(并且我使用了一个集合)。