Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回';IList&x27;vs';i收集和#x27;vs';收集';_C#_.net_Generics_Collections - Fatal编程技术网

C# 返回';IList&x27;vs';i收集和#x27;vs';收集';

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),或者是否

我不知道应该从公共API方法和属性返回哪种集合类型

我心目中的收藏是
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.

    接口与类的对比


    如果您对接口没有太多经验,我建议您坚持使用类。 我看到很多次开发人员跳转到接口,即使这不是必要的

    最后,做一个糟糕的界面设计,而不是一个好的类设计, 顺便说一句,它最终可以移植到一个好的界面设计中

    你会在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