Microsoft Guidelines for Collections:对几个部分感到困惑

Microsoft Guidelines for Collections: Confused about several parts

我在看微软的 Guidelines for Collections,我发现有几个部分很难理解:

X 不要在 public API 中使用 ArrayListList<T>。这是否意味着我应该完全避免 returning List<T>,或者我可以 return 它作为 IEnumerable/IList,但不是明确地作为 List<T>?

✓ 请尽可能使用最不专业的类型作为参数类型。大多数以集合为参数的成员使用IEnumerable<T>接口。在看到 ReSharper 抱怨 "possible multiple enumeration of IEnumerable" 之后,我认为当我期待一个预先计算的有限对象集合(即不是一个惰流)。不是这样吗?

✓ 请使用 Collection<T>Collection<T> 的子类作为属性或 return 代表 read/write 集合 的值。为什么不使用 ICollection<T>?我认为接口优于具体 类.

这些准则的存在是为了促进设计方法,这些方法在接受参数和 return 作为 return 类型方面具有灵活性。

如果你从一个方法 return List<T>,那个方法永远不会 return 任何 不是 List<T> 的东西.这在某些情况下可能没问题,但在其他情况下则不然。例如,考虑一种方法,其中 return 是在特定时间段内登录的用户集合。如果此方法 return 只是一个 List<T>,它必须一次性获取和 return 所有用户,因为这些是 List 的语义:您获得所有项目该方法的总计数为 returns。这可能是一个问题,如果用户数是几万 - 获取所有记录可能需要很长时间并且它们可能会占用大量内存。

如果此方法会 return IEnumerable<T>,则无法保证计数或一次获取所有项目 - 调用者可以遍历项目集合但无法获取一个项目中的所有项目单去。这允许被调用的方法 return 一个对象(实现 IEnumerable<T>),该对象以多个小批量收集数据,并根据要求 return 一个一个地发送它们。

此外,许多不同的集合类型实现了 IEnumerable<T>,因此此方法的另一个实现可能实际上决定 return 一个列表实例,转换为 IEnumerable<T>。调用方法不会知道或关心,因为它所期望的只是一个 IEnumerable<T>。这不是硬编码列表类型的情况 - 它不能交换为其他任何东西,因为它已经尽可能具体。

一般来说,通用集合接口将是最灵活的输入参数/return 任何方法的类型 - 接口将允许您以多种方式实现它、模拟它等。因此您可以非常灵活地控制通过或获得 returned 的内容。界面也没有(必然)有语义限制,随着产品的发展可能会变得不方便。

关于第一个建议,ArrayList 是一个糟糕的类型,在 .NET 2.0 之后永远不应该使用它,因为泛型类型在所有可能的方面都要好得多。