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

时间:2010-08-25 08:59:56

标签: c# .net list interface return-type

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

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

4 个答案:

答案 0 :(得分:22)

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

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

答案 1 :(得分:5)

来自C# - List or IList

  

如果你要透露你的课程   你可以使用其他人会使用的图书馆   通常希望通过它公开它   接口而不是具体   实现。这对你有帮助   决定改变执行   你的班级以后要用另一种   具体课程。在那种情况下   你的图书馆的用户不需要   从界面开始更新代码   不会改变。

     

如果您只是在内部使用它,   你可能不在乎这么多,并且使用   列表可能没问题。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

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

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