6

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

4

3 回答 3

13

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

于 2012-06-11T10:21:22.020 回答
3

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

于 2012-06-11T10:24:55.223 回答
2

接口主要用作函数中的参数或返回类型,以支持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 的更多信息: IListICollection接口的后代,是所有非泛型列表的基本接口。IList 实现分为三类:只读、固定大小和可变大小。无法修改只读 IList。固定大小的 IList 不允许添加或删除元素,但允许修改现有元素。可变大小的 IList 允许添加、删除和修改元素。

小费:

如果您只想支持foreach您的集合参数,IEnumerable就足够了。如果您还希望支持从集合中添加和删除项目,这IList是更好的选择。

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

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

于 2012-06-11T10:29:25.823 回答