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?
- 它不仅"写得满天飞",而且这个问题已经被问过和回答过了!
- 抱歉-在3页的结果之后,我放弃了寻找-所以"相关性"最近似乎有点让我失望!回答如下:stackoverflow.com/questions/400135/c-listt-or-ilistt/&hellip;;d
- 无需道歉,搜索功能有限。我在谷歌上搜索了:stackoverflow.com!找到那个混蛋!
- 嘿,好主意。不过,如果搜索不太好,我很惊讶他们自己没有使用谷歌API:(
我觉得你在看一些质量差的代码。
返回IList而不是List可以使代码更加灵活。您可以用实现IList的任何集合替换实现,而不破坏任何调用代码。这是一件好事……但只有当IList中定义的功能符合您的需求时。
您可以将其归纳为您应该始终返回尽可能通用的类型。在大多数情况下,您可以不使用IEnumerable,但是如果您需要更多的功能,那么IList可以工作。如果没有切割,则返回混凝土类型并进行处理。
在您提到的两种情况下,都需要使用IList没有直接提供的东西(如果没有,那么这两种方法都是错误的)。在这些情况下,方法应该返回List以提供所需的功能,或者调用者应该使用其他方法。
- 是啊!这正是每个人所说的最佳实践。但是,可能是因为我大部分时间都在使用面向更高抽象级别的特性(如业务规则)的代码,所以在过去的12年中,我没有遇到必须更改实现的情况。但是,当您处理实现list的类时,我可以看到一些情况,并且您希望这个类被其他一些情况继承,在这些情况下,使用ilist over list有好处。
原因是,您的方法可以用于实现IList的任何东西,而不仅仅是一个列表。更糟糕的是,自从Linq出现以来,我已经开始做很多东西返回Enumerable,甚至只是IEnumerable!
不过,我不确定我是否理解这一困难。如果某个东西正在返回一个实际的列表,并且它的返回取决于这个列表,或者它的使用是特定于这个列表的,那么它应该返回List。如果没有,那么就不需要将其强制转换为列表。
- 我怀疑调用代码是在该方法之后编写的,程序员不愿意更改该方法以返回一个具体的列表——我正试图理解这个决定是否合理。
这样做的目的是让调用者决定他们将使用什么集合。你可以看到很多人在任何时候都会返回IEnumerable。这样做通常被认为是很好的做法。返回ilist让调用者在返回列表时使用他们喜欢的ilist实现,这要求他们在所选的数据收集中手动复制列表的数据。
返回IEnumerable是理想的。
- 我不理解返回的IList如何让调用者决定实现(如果这就是您的意思,我们讨论的是返回,而不是接受作为参数)
- 当更多的类实现该接口时,我将以IEnumerable为例。当我调用一个返回IEnumerable的方法时,我只能通过它来决定foreach(),或者用它创建一个列表/队列/堆栈/排序列表等等。它允许我使用我喜欢的IEnumerable接口的实现。另一方面,返回列表会强制我使用列表或创建堆栈(例如),并手动输入堆栈中列表中的每个项。
- 如果我返回list,您也可以创建其中的任何一个(因为list是IEnumerable)!
实际上,如果可能,您应该返回IEnumerable,否则将返回IList。
这是因为将来你可能会想用列表以外的东西。实现自己的列表实现IList并不少见,然后不需要更改大部分代码。
从ilist中搜索派生类型,您会发现在.NET框架中有许多命中率!
- IEnumerable不能像很多代码那样工作(我很想改变它——首先,我讨厌在我们可以"流式"处理结果时将所有内容加载到内存中)。如果我们要实现一个自定义列表,我想我们更可能从列表开始,而不是滚动整个列表?
- IEnumerable实际上是返回可能最终用作列表的内容的一种很好的方法,因为可以直接从IEnumerable创建新的列表(如第一个示例)。我不能确定,但我怀疑这样做的开销与直接返回一个新的列表对象相比是零。返回IEnumerable的东西应该用yield实现,因此实际上不创建任何新的列表对象。因此,您实例化一个列表并向其添加元素的次数将以任何方式相同。
- 是的,我知道IEnumerable并不总是适合这个账单,但是如果它适合,你可以突然使用固定数组和iquerables之类的东西,一旦你习惯了它,这会有很大帮助。更高级的列表根本不需要扩展列表,一个例子可能是懒惰加载的列表与列表具有完全不同的存储策略,所以是的列表可能是基列表,但我通常不使用它(在这种情况下,我将它包装起来)。