如果我有一个采用某种类型集合的函数,我应该使用哪种参数类型?
我之前认为IEnumerable
是默认值,但我想知道这是否正确,如果是,为什么。
ICollection
似乎也是一个有效的候选人(由于其名称),但我得到的印象是IEnumerables更加用户友好。
我想看看框架给我们提供的例子是个好主意,但我发现像String.Join
这样的东西要求输入一串字符串。
答案 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:
IList
是ICollection
接口的后代,是所有非泛型列表的基接口。 IList实现分为三类:只读,固定大小和可变大小。无法修改只读IList。固定大小的IList不允许添加或删除元素,但它允许修改现有元素。可变大小的IList允许添加,删除和修改元素。
提示强>
如果您只想支持
foreach
收藏品 参数,IEnumerable
应该足够了。万一你也想要 支持在集合中添加和删除项目,IList
是 更好的选择。
<强>建议:强> 这篇博文:IEnumerable, ICollection, IList Compared当然可以帮助您做出更好,更准确的决定。
此外,请查看this article以了解IList和IEnumerable的性能和其他比较。