日期:2014-05-19  浏览次数:20395 次

为什么在petshop中返回的实体集都是IList<>啊,而不是List<>呢?
比如在Category.cs中,
//获取所有宠物种类
public   IList <CategoryInfo>   GetCategories()
//按id号获取单个宠物种类
public   CategoryInfo   GetCategory(string   categoryId)
第一个方法返回的是实体   CategoryInfo的集合,为什么用的是IList <CategoryInfo> ,而不是List <CategoryInfo> 呢?

------解决方案--------------------
面向接口编程。

如果.Net 3.0或4.0,5.0里面,List可能产生一些变化,但是IList却不太可能变化(因为只是个接口,实现又不在这里,变化个接口意义不太大,就算这个接口不合理也是新加一个接口不会去改接口的),这只是一个简单的例子而已。

返回一个IList给了使用上更多灵活性,这个才是更重要的。
------解决方案--------------------
基本上,IList <T> 与List <T> 类型的接口功能是完全一样的。

.net不支持多重继承。那么使用IList <T> 就能够适应更多的类型,包括不是从List <T> 继承的类型。

不过,实际上使用Interface编程是非常令人痛苦的。因此,一般人返回一个这种集合的时候十有八九会从List <T> 继承,而不会让自定义的集合仅实现IList <T> 。好在List <T> 也是IList <T> ,所以使用IList <T> 完全可以隐藏这种乱七八糟的选择。

综合起来看,IList <T> 很难用,但是灵活。
------解决方案--------------------
我觉得是最小使用原则,如果接受者并不需要具体的容器,而只需要一个可以被当作容器的“东西”,这个时候就不必返回一个具体的容器。

另一个方面也是从语义上来说,IList强调我返回一个容器,List强调我返回一个特定的容器。

面向接口编程不能生搬硬套,要不然也会很痛苦。