为什么返回集合接口而不是具体类型?

我注意到在其他人的代码中,返回generics集合的方法几乎总是返回一个接口(例如IEnumerableIList ),而不是具体的实现。

我有两个相关的问题。 首先,为什么(如果有的话)返回接口被认为更好? 其次,是否有一个包含Sort方法的集合接口(如List那样)?

来自C# – List或IList

如果您通过其他人将使用的库公开您的类,您通常希望通过接口而不是具体实现来公开它。 如果您决定稍后更改类的实现以使用其他具体类,这将有所帮助。 在这种情况下,您的库的用户将不需要更新他们的代码,因为接口不会更改。

如果你只是在内部使用它,你可能不在乎这么多,使用List可能没问题。

对于第一个问题:如果返回界面,则可以保留更多灵活性。 您可以稍后更改实现以返回不同的具体类型。 另一方面,它显然给呼叫者更少的信息,因此他们可能无法执行某些操作。 (例如,如果你返回List ,调用者可以使用ConvertAll等……如果你只声明你返回IList ,他们就不能。)在某些情况下,值得指定具体类型; 我通常更喜欢至少从接口开始,并且如果我发现我经常想要使用额外的可用方法,那么只会将具体类型作为返回类型。

其次,没有标准集合接口具有Sort方法。 另一方面,您可以编写一个扩展方法来对任何IList进行排序。 就个人而言,我通常更喜欢LINQ OrderByOrderByDescendingThenByThenByDescending方法……虽然它们返回一个新序列,而不是排序到位。

我们使用接口为我们的实现提供更多灵活性。 因此,如果您的方法具有IEnumerable的返回类型,则可以将它从List返回的对象更改为Array而不更改依赖于该方法的对象。

它也具有表现力:如果你正在返回一个IEnumerable,当对象被使用时,编码器很清楚我们只关心它是某种集合,而不是特定的类型

我不能代表所有人,但一般来说我只是因为我喜欢只返回我需要的东西。当你需要的是一个可以迭代的可枚举集合时,为什么要传回一个完整的集合。

至于你问题的另一部分,你总是可以使用IList,然后使用LINQ进行排序:

 list.OrderBy(a=>a.Id);