ICollection<Person> 的返回类型是什么意思?

4
我正在查看一些与Entity Framework 4相关的代码示例,作者创建了一个返回ICollection<Person>的方法。我知道ICollection是一个接口,Person是集合中的对象类型,我知道我得到的是Persons的集合。
问题是:为什么要使用ICollection而不是List<>?为什么要像这样使用接口?我曾将接口用作类的“蓝图”,指定所需成员,但我并不真正理解这里的用法。
3个回答

12

在公共API中,通常最好返回接口而不是具体的类。

这样可以让实现在后期进行更改。例如,目前可能正在返回一个List<T>,但在以后可能会进行优化,返回一种内存效率更高、允许流式处理或具有其他许多优势的不同类型的集合。只要该类仍然实现ICollection<T>,实现就可以自由切换而不会导致破坏性的API更改。


就像IEnumerable和其他类似的接口在整个.net中被广泛使用一样。 - Mark
一个很好的例子是返回IEnumerable<T>,当使用yield return时:http://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx。通过这种组合,您不必在返回列表之前填充整个列表。如果用户只对列表的部分感兴趣,则只有他们阅读过的部分才会被填充。这也可以简化生成列表的代码,因为您不必创建一个临时列表来返回结果。 - Merlyn Morgan-Graham
1
是的 - IEnumerable<T> 比 ICollection<T> 更加灵活,但是 ICollection<T> 又比 IList<T> 更加灵活。返回更简单的接口,您将拥有更多更改实现的选项... - Reed Copsey

0
GoF 设计模式书籍的关键之一是要针对接口进行编程,而不是针对实现。这样做的原因是它提供了自由度。通过返回一个接口而不是特定类型,实现可以更轻松地在不影响调用代码的情况下进行更改。

0

除非用户需要,否则您的API应尽可能少地暴露实现细节,在这种情况下使用List<Person>是实现细节。例如,如果您或您的用户知道他们想通过索引访问结果集,则最好返回IList<Person>而不是ICollection<Person>,但如果您不确定用户的场景,您应该尽可能地公开最基本的抽象(即在这种情况下,IEnumerable<Person>可能已经足够)。

请记住,如果您最近决定使用更多派生的返回类型,它不会破坏任何现有的客户端,但您不能使用更基本的返回类型而不破坏其中一些客户端。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接