gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:26:06 25 4
gpt4 key购买 nike

在.NET framework 中,有一些函数可以同时接受IEnumerableArray 参数,或者params Array 参数。

既然 IEnumerable 会满足任何提供 Array 的调用代码,为什么要实现它?

另一方面,

params Array 不会替换 IEnumerable,而是替换 Array。

所以在我看来,只有 IEnumerableparams Array 是必需的。

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


示例 1:

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

示例 2:

Path.Combine(string path1, string path2);
Path.Combine(string path1, string path2, string path3);
Path.Combine(string path1, string path2, string path3, string path4);
--> Path.Combine(params string[] paths);

最佳答案

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

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

请注意,还有第三种情况:数组可以加速方法的方法,因为它可以被多次重新读取。您不应该多次重读 IEnumerable<T> , 因为不能保证它可以被重读,或者重读它不会产生很大的成本。

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

关于c# - 为什么 .NET Framework 会为数组和 IEnumerable & params [] 重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50502419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com