关于asp.net mvc:IList<>

IList<> returned type instead of List<>

我在依赖项注入控制器的一个例子中发现了这个方法。使用接口类型IList<>而不是List<>的原因是什么?

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

谢谢


实际原因是,你要去问最初的程序员这个方法。

不过,我们可以想出一个合理的理由。

  • 输入参数应尽可能开放和通用。如果可以使用任何可以枚举的集合类型,则不要接受数组。(也就是说,如果你要做的只是做一个foreach,那么最好选择IEnumerable而不是List)。
  • 输出参数和返回类型应尽可能具体,但尽量返回最可用和最灵活的数据类型,而不牺牲性能或安全性。如果可以返回为结果(如int[]List创建的数组或列表,则不要返回只能枚举的集合(如IEnumerable)。

这些指导原则在互联网上列出了很多地方(用不同的词来说),它们可以帮助人们编写好的API。

IListList好的原因是您返回的集合可以是:

  • 枚举结束(流访问)
  • 按索引访问(随机访问)
  • 修改(添加、删除等)

如果您要返回List,实际上不会添加任何值,除非返回一个具体的类型,而不仅仅是实现该接口的任何类型。因此,最好返回接口,而不是具体类型。您不会在外部丢失任何有用的特性,并且您仍然可以保留将来用不同的东西替换返回的实际对象的可能性。


目标接口总是比目标具体类型更好。

所以,如果返回IList,这意味着任何实现IList的东西都可以返回,那么就提供更好的分离。

查看此信息以了解更多信息

为什么公开列表被认为不好?


这是OOP中的基本规则。有一个接口是很好的,这样您的客户机(getgenrenames的调用者)就只知道如何调用(函数签名、唯一需要记住的东西,而不是实现细节等)来获得服务。

接口编程支持OOP的所有优点。它更通用,保持关注点的分离,更可重用。