C# 返回';IList&x27;vs';i收集和#x27;vs';收集';
我不知道应该从公共API方法和属性返回哪种集合类型 我心目中的收藏是C# 返回';IList&x27;vs';i收集和#x27;vs';收集';,c#,.net,generics,collections,C#,.net,Generics,Collections,我不知道应该从公共API方法和属性返回哪种集合类型 我心目中的收藏是IList、ICollection和Collection 返回这些类型中的一种总是优先于其他类型,还是取决于具体情况?ICollection是一个公开集合语义的接口,例如Add()、Remove()和Count Collection是ICollection接口的具体实现 IList本质上是一个基于随机顺序访问的ICollection 在这种情况下,您应该决定结果是否需要列表语义,例如基于顺序的索引(然后使用IList),或者是否
IList
、ICollection
和Collection
返回这些类型中的一种总是优先于其他类型,还是取决于具体情况?ICollection是一个公开集合语义的接口,例如Add()
、Remove()
和Count
Collection
是ICollection
接口的具体实现
IList
本质上是一个基于随机顺序访问的ICollection
在这种情况下,您应该决定结果是否需要列表语义,例如基于顺序的索引(然后使用
IList
),或者是否只需要返回一个无序的结果“包”(然后使用ICollection
)。通常,您应该返回一个尽可能通用的类型,也就是说,对消费者需要使用的返回数据了解得足够多的人。这样,您就可以更自由地更改API的实现,而不会破坏正在使用它的代码
还可以将
IEnumerable
接口视为返回类型。如果只对结果进行迭代,则使用者不需要更多。IList和ICollection
之间的主要区别在于IList
允许您通过索引访问元素<代码>IList描述类似数组的类型。i集合中的元素只能通过枚举访问。两者都允许插入和删除元素
如果只需要枚举集合,则首选IEnumerable
。它有两个优势:
它不允许更改集合(但不允许更改元素,如果它们是引用类型)
它允许尽可能多的源,包括通过算法生成的枚举,而不是集合
允许
Collection
是一个基类,主要对集合的实现者有用。如果您在接口(API)中公开它,许多非从中派生的有用集合将被排除
IList
的一个缺点是数组实现了它,但不允许添加或删除项(即不能更改数组长度)。如果对数组调用IList.Add(item)
,将引发异常。这种情况有些缓和,因为IList
有一个布尔属性IsReadOnly
,您可以在尝试执行此操作之前进行检查。但在我看来,这仍然是图书馆的设计缺陷。因此,当需要添加或删除项时,我直接使用列表
。返回接口类型更一般,因此(缺少关于特定用例的更多信息)我倾向于此。如果要公开索引支持,请选择IList
,否则ICollection
就足够了。最后,如果要指示返回的类型是只读的,请选择IEnumerable
如果您以前没有读过,Brad Abrams和Krzysztof Cwalina写了一本很棒的书,题为《框架设计指南:可重用.NET库的约定、习惯用法和模式》(您可以从下载摘要)。这个问题涉及到一些主题:
- 接口与类
- 从几个相似的类、集合、列表、数组中选择哪个特定类
- 公共类与子项(“泛型”)集合
如果您对接口没有太多经验,我建议您坚持使用类。 我看到很多次开发人员跳转到接口,即使这不是必要的 最后,做一个糟糕的界面设计,而不是一个好的类设计, 顺便说一句,它最终可以移植到一个好的界面设计中 你会在a.p.I.中看到很多接口,但是,不要急着去看, 如果你不需要它 您最终将学习如何将接口应用于代码 从几个相似的类、集合、列表、数组中选择哪个特定类? c#(dotnet)中有几个类可以互换。如前所述,如果您需要来自更具体类的内容,例如“CanBeSortedClass”,那么请在a.P.I.中明确说明 你的A.p.I.用户真的需要知道你的类可以被排序,或者对元素应用某种格式吗?然后使用“CanBeSortedClass”或“ElementsCanBePaintedClass”, 否则使用“GenericBrandClass” 否则,请使用更通用的类 普通集合类与子项(“泛型”)集合的比较 您会发现有些类包含其他元素, 您可以指定所有元素都应为特定类型 泛型集合是可以使用同一集合的类, 对于多个代码应用程序,无需创建新集合, 对于每个新的子项类型,如下所示:集合 您的A.p.I.用户是否需要一个非常特定的类型,所有元素都需要相同的类型 使用类似于
List
的方法
您的A.p.I.用户是否需要几种相关类型
为您的A.p.I.公开列表
,并在内部使用列表
,列表
,其中橙色
,香蕉
和草莓
是水果
的后代
你的A.p.I.用户是否需要g