【问题标题】:Should I return an IEnumerable type, or a List?我应该返回一个 IEnumerable 类型还是一个列表?
【发布时间】:2020-03-17 11:16:18
【问题描述】:

我已经定义了一个函数:public IEnumerable<User> GetAllUsers()

该函数的逻辑是这样的:

var userList = new List<User>
.. logic ...
return userList;

定义返回类型IEnumerable&lt;User&gt; 有什么好处,还是我应该简单明了地定义返回List&lt;User&gt; 类型?

【问题讨论】:

标签: c#


【解决方案1】:

这将取决于。最好尽可能返回最严格的类型,但IEnumerable 的问题在于它通常不会被多次枚举。例如,IEnumerable 可能正在从数据库中进行选择,并且每个枚举都将启动一个可能长时间运行的查询。

在您的情况下,如果您希望返回有关用户的信息,那么我会考虑使用 IReadOnlyListIReadOnlyCollection

【讨论】:

    【解决方案2】:

    每个集合都可以隐式转换为 IEnumerable。确实,每次您都会将一个输入到 foreach 循环中。 foreach 适用于 Enumerables。对于遇到此异常情况的每个人的烦恼:Unable to remove list item from list inside a for each loop C#

    由于您可能在返回之前完成了列表的填写,因此我认为 Enumerables 没有任何优势。他们真正擅长的是向消费者隐藏某种异步数据检索。 使用 Enumerable 时发生的检索。有关实际示例,请参阅 Directory.EnumerateFiles()

    List&lt;T&gt; 更通用。如果有人需要IEnumerable&lt;T&gt;,他们可以从中制作一个,而无需大量工作。

    【讨论】:

      【解决方案3】:

      As Guidelines for Collections said:

      请使用ReadOnlyCollection&lt;T&gt;ReadOnlyCollection&lt;T&gt; 的子类,或 在极少数情况下IEnumerable&lt;T&gt; 用于属性或返回值 表示只读集合。

      一般来说,更喜欢ReadOnlyCollection&lt;T&gt;。如果不满足一些 要求(例如,集合不能实现IList),使用 通过实现IEnumerable&lt;T&gt;ICollection&lt;T&gt;IList&lt;T&gt;。如果您确实实现了自定义只读集合,请实现 ICollection&lt;T&gt;.IsReadOnly 返回 true。

      如果您确定只有您想要的场景 支持只向前迭代,你可以简单地使用 IEnumerable&lt;T&gt;.

      不要在公共 API 中使用 ArrayList 或 List

      这些类型是设计用于内部的数据结构 实现,而不是在公共 API 中。列表针对 以 API 的清洁度为代价的性能和功率,以及 灵活性。例如,如果您返回 List,您将永远不会 能够在客户端代码修改时接收通知 收藏。此外,List 公开了许多成员,例如 BinarySearch、 在许多情况下没有用或不适用。以下两个 部分描述了专门为使用而设计的类型(抽象) 在公共 API 中。

      【讨论】:

      • 只有在实际需要调用其方法之一时,调用者才必须强制转换为 List。如果它只需要枚举它,则不需要强制转换(我不是反对者)。一般来说,我更喜欢返回最具体的类型(与接受最通用的类​​型作为输入参数相反):我看到的唯一缺点是,如果不重新编译客户端代码,以后将无法更改它。根据情况,这或多或少可能是个问题,因此影响了做出的选择
      • 我不是反对者。我修复了您的链接(已损坏),但本文不建议在公共 API 中返回 List
      • @AccessDenied 感谢您的回复。请看我更新的回复。谢谢
      猜你喜欢
      • 2014-04-17
      • 2012-08-03
      • 2011-03-11
      • 2013-03-20
      • 1970-01-01
      • 2011-03-03
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多