我注意到在其他人的代码中,返回泛型集合的方法几乎总是返回一个接口(例如IEnumerable<T>
或IList<T>
),而不是具体的实现。
我有两个相关的问题。首先,为什么(如果有的话)返回接口被认为更好?其次,是否有一个包含Sort方法的集合接口(如List<T>
所做的那样?)
答案 0 :(得分:22)
对于第一个问题:如果返回界面,则可以保留更多灵活性。您可以稍后更改实现以返回不同的具体类型。另一方面,它显然给呼叫者更少的信息,因此他们可能无法执行某些操作。 (例如,如果你返回List<T>
,调用者可以使用ConvertAll等......如果你只声明你返回IList<T>
,他们就不能。)在某些情况下,值得指定具体类型;我通常喜欢至少从接口开始,只有当我发现我经常想要使用额外的可用方法时,才会将具体类型作为返回类型。
其次,没有标准集合接口具有Sort
方法。另一方面,您可以编写一个扩展方法来对任何IList<T>
进行排序。就个人而言,我通常更喜欢LINQ OrderBy
,OrderByDescending
,ThenBy
和ThenByDescending
方法......虽然它们会返回一个新序列,而不是排序。
答案 1 :(得分:5)
如果你要透露你的课程 你可以使用其他人会使用的图书馆 通常希望通过它公开它 接口而不是具体 实现。这对你有帮助 决定改变执行 你的班级以后要用另一种 具体课程。在那种情况下 你的图书馆的用户不需要 从界面开始更新代码 不会改变。
如果您只是在内部使用它, 你可能不在乎这么多,并且使用 列表可能没问题。
答案 2 :(得分:2)
我们使用接口为我们的实施提供更多灵活性。因此,如果您的方法具有IEnumerable的返回类型,则可以将它从List返回的对象更改为Array而不更改依赖于该方法的对象。
它也具有表现力:如果你要返回一个IEnumerable,当对象被使用时,编码器很清楚我们只关心它是某种集合,而不是特定的类型
答案 3 :(得分:1)
我不能代表所有人,但通常我只是因为我喜欢只返回我需要的东西。为什么你需要的是一个可以迭代的可枚举集合,为什么要传回一个完整的集合。
至于问题的其他部分,你总是可以使用IList,然后使用LINQ进行排序:
list.OrderBy(a=>a.Id);