IList 真的是数组更好的替代品吗?

Is IList really a better alternative to an array

今天我读了 Eric Lippert 的一篇 post,其中描述了 the harm of arrays。它提到当我们需要值的集合时,我们应该提供 values,而不是指向值列表的 variable。因此 Eric 建议,每当我们想要 return 方法中的项目集合时,我们应该 return 一个 IList<T>,它提供与数组相同的内容,即它:

  1. 启用索引访问
  2. 启用迭代项目
  3. 是强类型的

然而,与数组相比,列表还提供添加或删除项目的成员,从而修改集合对象。我们当然可以将集合包装到 ReadOnlyCollection 和 return 和 IEnumerable<T> 中,但是这样我们就失去了索引的可访问性。此外,调用者不知道 ReSharper 警告 "possible iterations of the same enumerations" 是否适用,因为他不知道在内部枚举只是一个包含在 ReadOnlyCollection 中的列表。所以调用者无法知道集合是否已经具体化。

所以我想要的是一个项目集合,其中集合本身是不可变的(但是这些项目不一定是,它们也不会在 IList 上),这意味着我们不能add/remove/insert 项添加到基础列表。然而,这对我来说似乎很奇怪 return 从我的 API 发送 ReadOnlyCollection,至少我从未见过 API 这样做。

因此数组似乎非常适合我的需要,不是吗?

We could of course wrap the collection into a ReadOnlyCollection and return an IEnumerable<T>

为什么要这样做? ReadOnlyCollection<T> 实现了 IList<T>,所以除非有更好的方法,声明一个 return 类型的 IList<T> 和 returning 一个 ReadOnlyCollection<T> 的实例看起来像不错的选择。

然而,碰巧在当前的.NET Framework 版本中,有一种稍微好一点的方法:return ReadOnlyCollection<T> 的实例,但指定 return 类型的IReadOnlyList<T>。虽然 IList<T> 并没有真正承诺允许调用者进行修改,但 IReadOnlyList<T> 明确了意图。