如果我有一个接受某种类型集合的函数,我应该使用什么参数类型?
我以前假设IEnumerable
是默认值,但我想知道这是否正确,如果正确,为什么。
ICollection
也似乎是一个有效的候选人(由于它的名字),但我得到的印象是 IEnumerables 对用户更友好。
我认为查看框架为我们提供的示例将是一个好主意,但我发现类似String.Join
, 要求字符串数组。
3 回答
您选择对客户影响最小但允许您完成工作的那个。如果您可以摆脱IEnumerable<T>
over ICollection<T>
,那么您应该使用它,因为这为您的 API 的客户端提供了更大的灵活性。
IEnumerable 比 ICollections 更受欢迎。 这是对您问题的慷慨回答。
接口主要用作函数中的参数或返回类型,以支持I
设计SOLID
原则(Interface Segregation Principle),使转换更容易,支持将多个具体类型传递给接口参数,并从客户端隐藏(封装)实际参数类型你的公共职能。
- 关于
IEnumerable
:
非常基本,它暴露了枚举器,它支持对非泛型集合的简单迭代。
[ComVisibleAttribute(true)]
public interface IEnumerable
- 这是关于
ICollection
:
ICollection 接口扩展了 IEnumerable;IDictionary 和 IList 是扩展 ICollection 的更专业的接口。IDictionary 实现是键/值对的集合,如 Hashtable 类。IList 实现是值的集合,其成员可以通过索引访问,如 ArrayList 类。一些限制对其元素的访问的集合,例如 Queue 类和 Stack 类,直接实现了 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 比较肯定会帮助您做出更好、更准确的决定。
此外,请查看本文以了解 IList 和 IEnumerable 的性能和其他比较。