函数参数:IEnumerable、ICollection或数组
本文关键字:ICollection 数组 IEnumerable 参数 函数 | 更新日期: 2023-09-27 18:36:43
如果我有一个函数接受某种类型的集合,我应该使用什么参数类型?
我以前假设IEnumerable
是默认值,但我想知道这是否正确,如果是,为什么。
ICollection
似乎也是一个有效的候选者(由于其名称),但我的印象是 IEnumerables 更用户友好。
我认为查看框架给我们的示例是个好主意,但我发现像 String.Join
这样的东西需要字符串数组。
你选择对客户施加最少但允许你完成工作的那个。如果你可以摆脱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 的更多信息: IList
是 ICollection
接口的后代,是所有非泛型列表的基本接口。IList 实现分为三类:只读、固定大小和可变大小。只读 IList 无法修改。固定大小的 IList 不允许添加或删除元素,但它允许修改现有元素。可变大小的 IList 允许添加、删除和修改元素。
提示:
如果您只想为您的收藏支持
foreach
参数,IEnumerable
应该足够了。 如果您还想要 支持在集合中添加和删除项,IList
更好的选择。
建议:这篇博文:IEnumerable,ICollection,IList Compare 肯定会帮助您做出更好、更准确的决定。
此外,请查看本文以了解 IList 和 IEnumerable 的性能和其他比较。