函数参数:IEnumerable,ICollection还是数组?

时间:2012-06-11 10:18:15

标签: c# .net parameters

如果我有一个采用某种类型集合的函数,我应该使用哪种参数类型?
我之前认为IEnumerable是默认值,但我想知道这是否正确,如果是,为什么。
ICollection似乎也是一个有效的候选人(由于其名称),但我得到的印象是IEnumerables更加用户友好。
我想看看框架给我们提供的例子是个好主意,但我发现像String.Join这样的东西要求输入一串字符串。

3 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

  • 关于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(真)] 公共接口IList:ICollection,IEnumerable

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

提示

  

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

<强>建议: 这篇博文:IEnumerable, ICollection, IList Compared当然可以帮助您做出更好,更准确的决定。

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