的IList<>返回类型而不是List<>

时间:2015-07-31 11:12:34

标签: asp.net-mvc generics

我在依赖Injecting a Controller的一个示例中找到了此方法。使用接口类型IList<>而不是List<>的原因是什么?

public IList<string> GetGenreNames()
{
    var genres = from genre in storeDB.Genres
                 select genre.Name;
    return genres.ToList();
}

由于

3 个答案:

答案 0 :(得分:3)

实际的原因,你要问那个方法的原始程序员。

然而,我们可以提出一个似是而非的理由。

  • 输入参数应尽可能开放和通用。如果可以使用任何可以枚举的集合类型,请不要使用数组。 (即如果您要做的只是做IEnumerable<int>),则List<int>优先于foreach
  • 输出参数和返回类型应尽可能具体,但尝试在不牺牲性能或安全性的情况下返回最可用和最灵活的数据类型。如果您可以返回专门为结果创建的数组或列表(例如IEnumerable<int>int[]),则不要返回只能枚举的集合(如List<int>)。

这些指南列在互联网上的许多地方(尽管用不同的词语),可以帮助人们编写好的API。

IList<T>优于List<T>的原因是您要返回的集合可以是:

  • 枚举(流媒体访问)
  • 通过索引访问(随机访问)
  • 修改(添加,删除等)

如果你要返回List<T>,你实际上不会添加任何值,除了返回一个具体类型而不仅仅是任何类型,它实现了该接口。因此,最好返回接口而不是具体类型。你不会在外面丢失任何有用的功能,你仍然可以在将来用不同的东西替换返回的实际对象。

答案 1 :(得分:2)

定位界面总是比定位具体类型更好。

因此,如果返回IList,这意味着可以返回实现IList的任何内容,提供更好的分离。

查看更多信息

Why is it considered bad to expose List<T>?

答案 2 :(得分:0)

这是OOP中的一些基本规则。拥有一个接口是很好的,所以你的客户端(GetGenreNames的调用者)只知道如何调用(函数签名,只记住,而不是实现细节等)来获得服务。

接口编程支持OOP的所有好东西。它更加普遍,保持关注点分离,更可重复使用。