函数参数:IEnumerable、ICollection或数组

本文关键字:ICollection 数组 IEnumerable 参数 函数 | 更新日期: 2023-09-27 18:36:43

如果我有一个函数接受某种类型的集合,我应该使用什么参数类型?
我以前假设IEnumerable是默认值,但我想知道这是否正确,如果是,为什么。
ICollection似乎也是一个有效的候选者(由于其名称),但我的印象是 IEnumerables 更用户友好。
我认为查看框架给我们的示例是个好主意,但我发现像 String.Join 这样的东西需要字符串数组。

函数参数:IEnumerable、ICollection或数组

你选择对客户施加最少但允许你完成工作的那个。如果你可以摆脱IEnumerable<T> ICollection<T>,那么你应该使用它,因为这为你的API客户端提供了更大的灵活性。

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

接口主要用作函数中的参数或返回类型,以支持SOLID设计原则(接口隔离原则)中的I,以使转换更容易,以支持将多个具体类型传递给接口参数,并对公共函数的客户端隐藏(封装)实际参数类型。

  • 关于IEnumerable

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

[ComVisibleAttribute(true)]    
public interface IEnumerable
  • 这是关于ICollection

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

[ComVisibleAttribute(true)]
public interface ICollection : IEnumerable
  • 以下是关于IList界面:

    [ComVisibleAttribute(true)]公共接口 IList : ICollection, IEnumerable

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

提示:

如果您只想为您的收藏支持foreach 参数,IEnumerable应该足够了。 如果您还想要 支持在集合中添加和删除项,IList 更好的选择。

建议:这篇博文:IEnumerable,ICollection,IList Compare 肯定会帮助您做出更好、更准确的决定。

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