关于C#:为什么返回集合接口而不是具体类型?

Why return a collection interface rather than a concrete type?

本问题已经有最佳答案,请猛点这里访问。

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

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


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

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


来自C-列表或IList

If you are exposing your class through
a library that others will use, you
generally want to expose it via
interfaces rather than concrete
implementations. This will help if you
decide to change the implementation of
your class later to use a different
concrete class. In that case the
user's of your library won't need to
update their code since the interface
doesn't change.

If you are just using it internally,
you may not care so much, and using
List may be ok.


我们使用接口在实现中给予我们更多的灵活性。因此,如果方法的返回类型为IEnumerable,则可以将它从列表返回的对象更改为数组,而不更改依赖于该方法的对象。

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


我不能代表每个人说话,但一般来说,我这样做只是因为我只想返回我需要的东西。当你只需要一个可重复的可枚举集合时,为什么还要返回一个完整的集合呢?

对于问题的另一部分,您可以始终使用ilist,然后使用linq进行排序:

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