【问题标题】:Is the .NET IList<> (generic IList interface) obsolete or not practical?.NET IList<>(通用 IList 接口)是否已过时或不实用?
【发布时间】:2015-01-28 19:54:16
【问题描述】:

好吧,我遇到了很多在函数签名中使用 IList 但内部使用 List 的遗留代码。

现在只有 List 和数组(int[] 实现 IList)实现 IList。 ArrayList 实现了非泛型 IList,并且由于引入了泛型,因此使用可装箱/不可装箱的集合毫无意义。

List down 仍然有一个数组实现。我认为在 C# 中使用数组没有意义了。 LinkedList 没有实现 IList

如果我回想一下 C++ STL 容器/集合,它们也没有接口。从设计的角度来看,使用什么或使其可互换是没有问题的。或者你使用了一个迭代器,如果你想要可互换的,在 C# 中你可以使用 IEnumerable 如果你想要并且可以灵活和懒惰。

我认为没有理由将其更改为数组,并且我认为我无法编写比 List 更好的集合类。

现在出于实用主义,如果我将所有 IList 替换为 List 会有多糟糕?

【问题讨论】:

  • 显示一些代码。照原样,您的问题意义不大。使用接口的代码(即IList&lt;T&gt;)比需要特定实现的代码(即List&lt;T&gt;)更灵活。那么,为什么要从更灵活的设计切换到更不灵活的设计呢?没有一个好的代码示例,就不可能理解你的场景。见stackoverflow.com/help/mcve
  • 你想用ReadOnlyCollection&lt;T&gt;吗?您认为保持一般性会带来什么危害?
  • 多年来的大量讨论。这不是一个新问题,所以我不会重复历史。一些先前的讨论在这里stackoverflow.com/questions/434761/…。我同意 ArrayList(但不是 IList 因为它)不再是最佳选择。
  • 确实只有少数类型在框架中直接实现了IList&lt;T&gt;。但是,其中之一是Collection&lt;T&gt;,它用作多个框架集合的基类,例如ObservableCollection&lt;T&gt;,以及许多自定义集合。
  • OK 听到了您的所有顾虑并再次检查并Collection&lt;T&gt;ReadOnlyCollection&lt;T&gt;ObservableCollection&lt;T&gt; 实施IList&lt;T&gt;。之前有人问过,只是找不到。在我们的后端代码中,我们从未使用过任何这些,所以我想采用更统一的方法来加快开发速度。

标签: c# arrays list generics collections


【解决方案1】:

现在只有 List 和数组(int[] 实现 IList)实现 IList

不正确。

例如,如果您使用 NHibernate,它有自己的 IList&lt;T&gt; 实现,它用于表示列表,如果我没记错的话,如果您在映射实体中公开 List&lt;T&gt; 会抛出错误。

一般而言,公开接口而不是代码中的实现会使事情变得更加灵活,因为使用您的代码的人可能希望使用他们自定义的IList&lt;T&gt; 实现,并在他们不使用时强制他们使用List&lt;T&gt; t have to 是限制性的。


使用接口而不是具体实现被认为是一种好的做法:它是SOLIDD 的组成部分。

【讨论】:

  • 实现IList&lt;T&gt;的其他一些内置类是Collection&lt;T&gt;ReadOnlyCollection&lt;T&gt;ObservableCollection&lt;T&gt;
  • 再次检查,是的,这是真的:Collection、ReadOnlyCollection、ObservableCollection 实现 IList。对于永远不会发生的事情,我仍然觉得 IList 过于灵活。
  • @Laszlo 使用接口而不是具体实现是,我刚刚在编辑中对此进行了扩展。
  • 嗯,我在考虑 IList
【解决方案2】:

人们可以(并且确实)自己实现IList&lt;T&gt;。如果您将所有出现的IList&lt;T&gt; 替换为List&lt;T&gt;,那么您将破坏所有这些用途。

链接列表无法实现它,因为它们不允许随机访问。我觉得IList&lt;T&gt;是个不错的界面,经常用。

【讨论】:

  • "链表不能实现它"——链表可以实现它,只是效率不高。所以.NET 的LinkedList&lt;T&gt; 没有。但这并不能阻止其他人这样做。
猜你喜欢
  • 2010-11-13
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多