关于C#:为什么我要返回列表上的IList 而不是 List

Why should I return IList<T> over List<T>?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
C# - List or IList

它被写得到处都是,所以你应该从你的方法中返回IList,而不是List,但是我找不到任何真正好的理由。我一直在寻找这样做的代码,然后调用代码通常会做两件事之一:

  • 调用new List(returnedIList),这样它就可以使用列表中所有好的方法
  • 返回到List以便它可以使用列表中所有好的方法
  • 第一个是笨拙的,第二个是抛出(运行时)InvalidCastException,如果实现实际上改变为其他东西(这使得它完全愚蠢)。

    如果我使用List,由于某种原因,必须用IList的实现来替换它,我不能从List继承它,那么我将得到构建错误,并且必须更改一些代码。这可能是非常不可能的,如果它发生了,它不是很多工作要解决。当然,失去List和/或不得不铸造/新的List(存在、发现等)的利益不值得在这种不太可能的情况下把它们带回?

    那么,是否还有其他原因需要退回IList


    我觉得你在看一些质量差的代码。

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

    您可以将其归纳为您应该始终返回尽可能通用的类型。在大多数情况下,您可以不使用IEnumerable,但是如果您需要更多的功能,那么IList可以工作。如果没有切割,则返回混凝土类型并进行处理。

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


    原因是,您的方法可以用于实现IList的任何东西,而不仅仅是一个列表。更糟糕的是,自从Linq出现以来,我已经开始做很多东西返回Enumerable,甚至只是IEnumerable

    不过,我不确定我是否理解这一困难。如果某个东西正在返回一个实际的列表,并且它的返回取决于这个列表,或者它的使用是特定于这个列表的,那么它应该返回List。如果没有,那么就不需要将其强制转换为列表。


    这样做的目的是让调用者决定他们将使用什么集合。你可以看到很多人在任何时候都会返回IEnumerable。这样做通常被认为是很好的做法。返回ilist让调用者在返回列表时使用他们喜欢的ilist实现,这要求他们在所选的数据收集中手动复制列表的数据。

    返回IEnumerable是理想的。


    实际上,如果可能,您应该返回IEnumerable,否则将返回IList。

    这是因为将来你可能会想用列表以外的东西。实现自己的列表实现IList并不少见,然后不需要更改大部分代码。

    从ilist中搜索派生类型,您会发现在.NET框架中有许多命中率!