Roc*_*ngh 112 .net c# generics collections
我很困惑我应该从我的公共API方法和属性返回哪种集合类型.
我想到的收藏品是IList,ICollection和Collection.
返回其中一种类型总是优先于其他类型,还是取决于具体情况?
cor*_*erm 134
ICollection<T>是暴露集合语义诸如接口Add(),Remove()和Count.
Collection<T>是ICollection<T>接口的具体实现.
IList<T>本质上是一个ICollection<T>随机的基于订单的访问.
在这种情况下,您应该决定您的结果是否需要列表语义,例如基于订单的索引(然后使用IList<T>),或者您是否只需要返回无序的"包"结果(然后使用ICollection<T>).
Guf*_*ffa 68
通常,您应该返回尽可能通用的类型,即只知道消费者需要使用的返回数据的类型.这样,您可以更自由地更改API的实现,而不会破坏使用它的代码.
还将IEnumerable<T>接口视为返回类型.如果仅对结果进行迭代,则消费者不需要更多.
Oli*_*bes 57
IList<T>和之间的主要区别ICollection<T>是IList<T>允许您通过索引访问元素.IList<T>描述类似数组的类型.ICollection<T>只能通过枚举访问can中的元素.两者都允许插入和删除元素.
如果您只需要枚举一个集合,那么IEnumerable<T>首选.它有两个优点:
它不允许更改集合(但不允许更改为引用的对象,如果它们是引用类型).
它允许尽可能多种来源,包括通过算法生成的枚举,而不是集合.
Collection<T>是一个基类,主要用于集合的实现者.如果在接口(API)中公开它,将排除许多不是从它派生的有用集合.
一个缺点IList<T>是数组实现它但不允许你添加或删除项目(即你不能改变数组长度).如果调用IList<T>.Add(item)数组,则会抛出异常.这种情况有点解散,因为IList<T>有一个布尔属性IsReadOnly,您可以在尝试之前检查它.但在我看来,这仍然是图书馆的设计缺陷.因此,List<T>当需要添加或删除项目的可能性时,我直接使用.
IList<T>是所有通用列表的基本接口.由于它是有序集合,因此实现可以决定排序,从排序顺序到排序顺序.此外,Ilist还具有Item属性,允许方法根据索引读取和编辑列表中的条目.这使得可以在位置索引处向列表中插入值或从列表中删除值.
此外IList<T> : ICollection<T>,所有方法ICollection<T>也可在此处实施.
ICollection<T>是所有泛型集合的基本接口.它定义了大小,枚举器和同步方法.您可以在集合中添加或删除项目,但由于缺少index属性,您无法选择它在哪个位置发生.
Collection<T>提供了一个实现IList<T>,IList和IReadOnlyList<T>.
如果使用较窄的接口类型(例如ICollection<T>代替)IList<T>,则可以保护代码免受更改.如果使用更宽的接口类型IList<T>,则更容易破坏代码更改.
引自来源,
ICollection,ICollection<T>:您想要修改集合,或者您关心它的大小.IList,IList<T>:您想要修改集合,并且您关心集合中元素的排序和/或定位.