为什么使用IEnumerable<T>比List<T>更受欢迎?

3

我听说在调用方法时,尽量使用最低级别的类来传递参数非常重要。为什么呢?另外,我应该在哪里找到更多关于类层次结构的信息呢?我想知道 IEnumerable 继承自哪个类等等。

5个回答

4
如果您使用IEnumerable<T>作为参数类型,那么您可以传递任何实现该接口的类型。这包括List<T>Stack<T>Queue<T>等。

它还包括可能是LINQ查询结果的各种匿名类型,以及非常重要的IQueryable<T>


3
通过使用“低级”参数,您的方法可以处理更多种类的对象。这鼓励编写通用可重用的方法。 MSDN 可以告诉您各种不同的东西从哪里继承(在 IEnumerable 的情况下,它没有继承自任何东西,因为它代表了一个“列表”的最基本概念)。

2

Enumerable是只读序列,而List可以附加。

如果你设计公共API以便在各个地方都使用IList<T>,然后意识到你需要返回只读列表,那么你必须通过改用IEnumerable<T>来更改代码或使用可怕的ReadOnlyCollection。我称它为可怕的是因为它会在.Add/.Remove等操作上抛出异常。

因此,如果你只需要读取,则返回IEnumerable,如果你的调用者需要添加/附加,则返回IList。

另外:永远不要返回List<T>,始终返回IList<T>。原因是List是一个具体的类,不能以任何明智的方式被覆盖,而IList是一个接口,允许你更改实际的实现而不破坏公共契约。


1

我能想到的最快的方法是:如果您不再希望您的实现是 List<T> 类型,会发生什么?

假设有一天您决定重构应用程序以使用 LinkedList<T>SortedList<T>,那么您只需要更改该类型,而不是可能将您的集合传递给所有方法中的所有类型。

通过使用这种技术,您可以提高代码的可维护性。


1

这个想法是最大化函数的灵活性。如果您需要一个List<T>,那么调用者必须有一个可传递的列表。如果他们没有一个方便的列表,他们将不得不创建一个,这是昂贵的。另一方面,如果您需要IEnumerable<T>,则他们可以传递任何集合。

在.NET中查找类层次结构信息的最佳位置是MSDN。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接