我注意到在其他人的代码中,返回通用集合的方法几乎总是返回一个接口(例如 IEnumerable<T>
或 IList<T>
),而不是具体实现。
我的两个相关问题。首先,为什么(如果有的话)被认为返回接口更好?其次,是否有一种包含 Sort 方法的集合接口(如 List<T>
)?
我注意到在其他人的代码中,返回通用集合的方法几乎总是返回一个接口(例如 IEnumerable<T>
或 IList<T>
),而不是具体实现。
我的两个相关问题。首先,为什么(如果有的话)被认为返回接口更好?其次,是否有一种包含 Sort 方法的集合接口(如 List<T>
)?
关于第一个问题:如果你返回一个接口,你将获得更多的灵活性。稍后你可以更改实现以返回不同的具体类型。然而,显然会给调用者提供较少的信息,因此他们可能无法执行某些操作。(例如,如果你返回 List<T>
,则调用者可以使用ConvertAll等方法...但如果你只声明返回类型为IList<T>
,则不能这样做)。在一些情况下,指定具体类型是值得的;我通常倾向于从接口开始,只有当发现经常需要使用额外的可用方法时才将具体类型作为返回类型。
其次,没有标准集合接口具有Sort
方法。另一方面,你可以编写扩展方法来对任何IList<T>
进行排序。个人而言,我通常更喜欢使用LINQ的OrderBy
、OrderByDescending
、ThenBy
和ThenByDescending
方法……虽然它们返回一个新序列,而不是在原地排序。
如果你要通过一个库让别人使用你的类,一般来说你应该通过接口而不是具体实现来暴露它。这样做可以帮助你,如果你决定以后更改你的类的实现方式使用不同的具体类,那么使用你的库的用户就不需要更新他们的代码,因为接口没有变化。
如果你只是在内部使用它,可能不太关心这个问题,使用List可能没问题。
我不能代表每个人,但通常我这样做只是因为我喜欢只返回我需要的内容。当你只需要一个可枚举的集合时,为什么要返回一个完整的集合呢?
至于你问题的另一部分,你可以始终使用IList,然后使用LINQ进行排序:
list.OrderBy(a=>a.Id);
List<T>
,那么我可以直接使用它,或者作为IList<T>
或IEnumerable<T>
等等。这给调用方提供了更多选择。但这不是真正的问题所在。它是为了防止方法实现的更改破坏调用代码。如果该方法返回一个IEnumerable<T>
,那么我可以更改实现以使用任何支持该接口的容器,而无需修改调用代码。 - MhmmdIEnumerable
而不是一个具体的 List
的真正原因是为了保护调用代码免受实现变化的影响。抱歉,但我认为这个区别非常重要。 - Mhmmd