C# 函数参数:IEnumerable、ICollection还是数组?
如果我有一个接受某一类型集合的函数,我应该使用哪种参数类型?C# 函数参数:IEnumerable、ICollection还是数组?,c#,.net,parameters,C#,.net,Parameters,如果我有一个接受某一类型集合的函数,我应该使用哪种参数类型? 我之前假设IEnumerable是默认值,但我想知道这是否正确,如果正确,原因是什么。 ICollection似乎也是一个有效的候选项(因为它的名称),但我得到的印象是,IEnumerables更易于使用。 我想看看框架给我们提供的示例会是个好主意,但我发现类似于String.Join的东西需要一个字符串数组。您选择对客户端施加最小影响但允许您完成工作的字符串。如果您可以在ICollection上使用IEnumerable,那么您应该
我之前假设
IEnumerable
是默认值,但我想知道这是否正确,如果正确,原因是什么。ICollection
似乎也是一个有效的候选项(因为它的名称),但我得到的印象是,IEnumerables更易于使用。我想看看框架给我们提供的示例会是个好主意,但我发现类似于
String.Join
的东西需要一个字符串数组。您选择对客户端施加最小影响但允许您完成工作的字符串。如果您可以在ICollection
上使用IEnumerable
,那么您应该使用它,因为这为API的客户端提供了更大的灵活性。IEnumerable比ICollection更受欢迎。
是对您问题的慷慨回答。接口主要用作函数中的参数或返回类型,以支持
SOLID
中的I
设计原则(接口分离原则),使浇筑更容易,支持将多个混凝土类型传递给接口参数和隐藏(封装)公用函数客户端的实际参数类型
- 关于
:IEnumerable
[ComVisibleAttribute(true)]
public interface IEnumerable
- 以下是关于
:i收集的信息
[ComVisibleAttribute(true)]
public interface ICollection : IEnumerable
- 下面是关于IList的
interface: [ComVisibleAttribute(真实)] 公共接口IList:ICollection,IEnumerable
IList
是ICollection
接口的后代,是所有非泛型列表的基本接口。IList实现分为三类:只读、固定大小和可变大小。无法修改只读IList。固定大小的IList不允许添加或删除元素,但允许修改现有元素。可变大小的IList允许添加、删除和修改元素
提示:
如果您只想为您的收藏提供foreach
参数,IEnumerable
应该足够了。万一你也想要
支持从集合中添加和删除项,IList
更好的选择
建议:
这篇博文:肯定会帮助你做出更好、更准确的决定
此外,请查看IList和IEnumerable的性能和其他比较。前面已经回答了这个问题:致以最良好的祝愿。在.NET 4时间框架中添加了一个重载,因此它需要一个
IEnumerable
。获取数组的重载可以追溯到泛型之前的日子…@Oscar:这是关于返回类型的-我说的是参数。您希望为参数:Stack支持什么集合类型?队列字典?阵列?或者其他一些,您希望对参数化函数中的集合进行只读访问还是读写访问?这些将有助于更好地解释答案和更多建议。@Protectorone没关系。我更新了我的答案,以显示概括和具体的建议。特别是,我的答案中的博客链接会对你有更好的帮助。Always(对于给定的值Always)使用完成任务的最小抽象,这样您的客户机代码(您正在编写的代码)就不必使用相同的容器,您的函数变得更通用,具有更大的重用潜力。Well@BinaryWorrier我更新了答案,仅当需要添加或删除项的支持时才使用IList,如果只需要foreach支持,则使用IEnumerable。我希望您现在更好地理解了答案。抱歉,但我仍然不同意<代码>IEnumerable应该是首选,因为它是最小的抽象。e、 假设你有一个函数,它接受一系列数字,并得到最小值、最大值和平均值。如果函数采用ICollection,则实现I集合的任何类都可以使用它。如果它被编写为接受IEnumerable,那么它可以处理任何事情,因为您可以轻松地为数据读取器或文件读取器编写适配器,产生返回项,而不会造成额外的存储或处理开销,并且仍然使用相同的函数。@BinaryWorrier尽管您不同意我的回答,但我完全同意您的评论。如果原始的问题
清楚地给出了关于只读用法或读写用法(所需的集合参数)的提示,那么答案会更具体,并且达到……同意的程度。但是,在处理方法中作为输入参数传递的IEnumerable对象时,请注意。如果可以保证方法使用者始终提供列表、数组或集合,则可以改用ICollection。否则,您将需要枚举整个枚举(例如转换ToList())一次,然后使用枚举对象。