为什么.NET Framework重载数组和IEnumerable& params []?

时间:2018-05-24 06:29:40

标签: c# .net frameworks

在.NET框架中,有一些函数接受jira-rubyIEnumerable参数或Array参数。

由于params Array会满足提供IEnumerable的任何调用代码,为什么会实现?

另一方面,

Array不会替换params Array,但会取代IEnumerable

因此,在我看来,只需要Array.IEnumerable

问题:这背后的框架(如.NET)的意图是什么?如果被调用者使用反射,它是向下兼容吗?

示例1:

params Array

示例2:

File.WriteAllLines(string path, string[] contents);
--> File.WriteAllLines(string path, IEnumerable<string> contents);

1 个答案:

答案 0 :(得分:4)

对于示例1 :在此特定情况下,the string[] is from .NET 2.0,而the IEnumerable<string> is from .NET 4.0IEnumerable<T>的使用已变得很酷&#34;在引入LINQ(.NET 3.5)之后,IEnumerable<T>在.NET中占据了中心位置。在此之前,最常用的集合类型的数组(可能因为在.NET 1.1中它们是唯一的强类型基集合)。可能如果他们今天重写了.NET,他们就不会放置该方法的数组版本。

对于示例2 ,第四种方法需要一个数组,这是一个额外的对象(创建一个对象是一个成本......有时候你试图去掉这个成本)。为了速度,一些方法具有多个重载,这些重载具有所使用的参数的确切数量和类型。

请注意,还有第三种情况:数组可以加速方法的方法,因为它可以多次重读。您不应该多次IEnumerable<T>重读一次,因为无法保证可以重新阅读,或重新阅读它不会产生大笔费用。

示例:string.Concat(string[]) vs string.Concat(IEnumerable<T>)。第一个版本可以预先计算新字符串的总长度并分配必要的确切空间(因此它将循环string[]两次,一次计算总Length,第二次复制string到新string)。第二个必须使用增长缓冲区,因为它只能读取IEnumerable<T>一次。