为什么我应该将IList <t>返回到List <t>?</t> </t>

时间:2011-02-24 17:43:37

标签: c# .net generics interface

  

可能重复:
  C# - List<T> or IList<T>

从头到尾写的是你应该从你的方法返回IList<T>而不是List<T>,但我找不到任何真正好的理由。我一直在寻找执行此操作的代码,然后调用代码通常执行以下两项操作之一:

  1. 调用new List<T>(returnedIList)以便它可以使用List
  2. 上的所有好方法
  3. 转回List<T>,以便它可以使用List
  4. 上的所有好方法

    第一个是笨重的,第二个会抛出(运行时) InvalidCastException如果实现实际上已经改变为其他东西(这使得完全笨)。

    如果我使用List<T>,并且由于某种原因必须将其替换为IList<T>的实现,我无法从List<T>继承,那么我将遇到构建错误,并且必须改变一些代码。这可能是非常不可能的,如果发生这种情况,修复工作并不是很多。当然,不值得失去List<T>的好处和/或必须投出/新List<T>(存在,查找等)以便在这种不太可能的情况下让他们回来?

    那么,还有其他原因可以归还IList<T>吗?

4 个答案:

答案 0 :(得分:10)

在我看来,你正在看一些质量不佳的代码。

返回IList<T>而非List<T>可让您的代码更灵活。您可以使用任何实现IList<T>的集合替换实现,而不会破坏任何调用代码。这是一件好事......但只有当IList<T>中定义的功能符合您的需求时才会这样。

您可以概括地说,您应该始终返回最通用的类​​型。在大多数情况下,您可以使用IEnumerable<T>,但如果您需要更多功能,那么IList<T>可以正常运行。如果没有削减它,则返回具体类型并完成它。

在你提到的两种情况中,都需要使用IList<T>不直接提供的东西(如果没有,那么这两种方法都是错误的)。在这些情况下,该方法应返回List<T>以提供所需的功能,或者调用方应使用其他方法。

答案 1 :(得分:2)

原因是您的方法可以与任何实现IList<T>的方法一起使用,而不仅仅是List。但是,自从Linq问世以来,我已经开始做很多东西了Enumerable<T>甚至只是IEnumerable

但是,我不确定我是否理解这个困难。如果某些东西返回一个实际的列表,并且它的返回依赖于它,或者它的使用是特定的,那么它应该返回List<T>。如果没有,那么你就没有必要把它投射到List。

答案 2 :(得分:1)

如果可能,你真的应该返回IEnumerable,否则就是IList。

原因是您可能希望将来使用除List之外的其他内容。实现您自己的实现IList的列表并不常见,您不需要更改大部分代码。

从IList中搜索派生类型,您会发现在.NET框架内获得了很多命中!

答案 3 :(得分:1)

我们的想法是让来电者决定他们将使用哪些收藏品。你会看到很多人随时回来IEnumerable<T>。这通常被认为是良好的做法。返回IList让调用者在返回List时使用他们喜欢的IList的任何实现,List要求他们在他们选择的数据集合中手动复制List的数据。

返回IEnumerable是理想的。