IList 真的是数组更好的替代品吗?
Is IList really a better alternative to an array
今天我读了 Eric Lippert 的一篇 post,其中描述了 the harm of arrays。它提到当我们需要值的集合时,我们应该提供 values,而不是指向值列表的 variable。因此 Eric 建议,每当我们想要 return 方法中的项目集合时,我们应该 return 一个 IList<T>
,它提供与数组相同的内容,即它:
- 启用索引访问
- 启用迭代项目
- 是强类型的
然而,与数组相比,列表还提供添加或删除项目的成员,从而修改集合对象。我们当然可以将集合包装到 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>
明确了意图。
今天我读了 Eric Lippert 的一篇 post,其中描述了 the harm of arrays。它提到当我们需要值的集合时,我们应该提供 values,而不是指向值列表的 variable。因此 Eric 建议,每当我们想要 return 方法中的项目集合时,我们应该 return 一个 IList<T>
,它提供与数组相同的内容,即它:
- 启用索引访问
- 启用迭代项目
- 是强类型的
然而,与数组相比,列表还提供添加或删除项目的成员,从而修改集合对象。我们当然可以将集合包装到 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 anIEnumerable<T>
为什么要这样做? ReadOnlyCollection<T>
实现了 IList<T>
,所以除非有更好的方法,声明一个 return 类型的 IList<T>
和 returning 一个 ReadOnlyCollection<T>
的实例看起来像不错的选择。
然而,碰巧在当前的.NET Framework 版本中,有一种稍微好一点的方法:return ReadOnlyCollection<T>
的实例,但指定 return 类型的IReadOnlyList<T>
。虽然 IList<T>
并没有真正承诺允许调用者进行修改,但 IReadOnlyList<T>
明确了意图。