可能重复:
C# - List<T> or IList<T>
从头到尾写的是你应该从你的方法返回IList<T>
而不是List<T>
,但我找不到任何真正好的理由。我一直在寻找执行此操作的代码,然后调用代码通常执行以下两项操作之一:
new List<T>(returnedIList)
以便它可以使用List List<T>
,以便它可以使用List 第一个是笨重的,第二个会抛出(运行时) InvalidCastException
如果实现实际上已经改变为其他东西(这使得完全笨)。
如果我使用List<T>
,并且由于某种原因必须将其替换为IList<T>
的实现,我无法从List<T>
继承,那么我将遇到构建错误,并且必须改变一些代码。这可能是非常不可能的,如果发生这种情况,修复工作并不是很多。当然,不值得失去List<T>
的好处和/或必须投出/新List<T>
(存在,查找等)以便在这种不太可能的情况下让他们回来?
那么,还有其他原因可以归还IList<T>
吗?
答案 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是理想的。