关于c#:函数参数:IEnumerable,ICollection还是数组?

Function parameters: IEnumerable, ICollection or array?

如果我有一个函数接受一个特定类型的集合,我应该使用什么参数类型?我以前假设IEnumerable是违约,但我想知道这是否正确,如果是,为什么。ICollection也似乎是一个有效的候选者(因为它的名字),但我觉得IEnumerables对用户更友好。我想看看框架给我们的例子是个好主意,但是我发现像String.Join这样的东西需要一个字符串数组。


你选择对客户要求最少但能让你完成工作的客户。如果您可以通过ICollection摆脱IEnumerable,那么您应该使用它,因为这为您的API客户端提供了更大的灵活性。


IEnumerable比ICollections更受欢迎。这是对你问题的慷慨回答。


接口主要用作函数中的参数或返回类型,以支持SOLID中的I设计原则(接口分离原则),以使铸造更容易,支持将多个具体类型传递给接口参数,并隐藏(封装)实际参数类型,使其不受publ客户机的影响。集成电路功能。

  • 关于IEnumerable

非常基本,它公开了枚举器,它支持对非泛型集合进行简单迭代。

1
2
[ComVisibleAttribute(true)]    
public interface IEnumerable
  • 这是关于ICollection的:

ICollection接口扩展IEnumerable;IDictionary和IList是扩展ICollection的更专用的接口。IDictionary实现是键/值对的集合,如哈希表类。IList实现是一个值集合,其成员可以通过索引访问,如arraylist类。一些限制对其元素(如队列类和堆栈类)访问的集合直接实现ICollection接口。如果IDictionary接口和IList接口都不满足所需集合的要求,请从ICollection接口派生新的集合类,以获得更大的灵活性。

1
2
[ComVisibleAttribute(true)]
public interface ICollection : IEnumerable
  • 下面是关于IList接口的介绍:

    [ComvisibleAttribute(真)]公共接口IList:ICollection,IEnumerable

来自msdn关于ilist的更多信息:IListICollection接口的后代,是所有非泛型列表的基接口。IList实现分为三类:只读、固定大小和可变大小。无法修改只读IList。固定大小的ilist不允许添加或删除元素,但允许修改现有元素。可变大小的ilist允许添加、删除和修改元素。

提示:

In case you just want to support foreach for your collection
parameter, IEnumerable should be enough. In case you also want the
support for adding and removing items from the collection, IList is
the better choice.

建议:这篇博文:IEnumerable、ICollection、iList相比较,一定会帮助你做出更好、准确的决定。

此外,请看本文了解IList和IEnumerable的性能和其他比较。