为什么采用数量不受限制的参数的方法通常会定义带有较少参数的重载?


36

例如,System.IO.Path.Combine.NET中的方法具有以下重载:

Combine(params String[])
Combine(String, String)
Combine(String, String, String)
Combine(String, String, String, String)

最后三点是什么?

第一个将覆盖所有内容,就好像您仔细观察一样,它使用的是params关键字。向后兼容的论点仅涵盖该Combine(String, String)变体,因为它是.NET 4之前的唯一版本。

Answers:


56

主要原因是性能。“无限制参数”的语法糖实际上是一个字符串数组。如果仅传递一个字符串,为什么要创建仅包含一个字符串的数组?尤其是如果此方法的〜90%的调用将使用3个或更少的参数,则不需要重量较大的数组对象。由于不需要循环来定义方法,因此它的内存要轻一些,处理时间也要少一些。如果您有三个字符串,则只需为三个字符串编码。


要注意的另一件事是,Combine使用零个或一个路径段传递甚至没有意义,但是该params版本允许您执行此操作。
马修(Matthew)

4
大量重载接受不同数量的参数的原因并非出于可读性。这是为了提高性能,因为生成字符串数组然后进行处理会产生开销。接受的原因params string[]是为了提高可读性。
格雷格·伯格哈特

2
性能确实是原因,我相信这是专门用于期望从内部循环调用函数的情况。正如第三版《 C#编程语言》第 27页的布拉德·艾布拉姆斯(Brad Abrams)的注释所言:“ [C]模型确实在每个调用中隐式创建了一个额外的对象分配(包含数组)。这很少有问题,但是在内部在可能会变得效率低下的循环类型场景中,我们建议为主流情况提供重载,params而仅对边缘情况使用重载。StringBuilder.AppendFormat()重载家族就是一个例子。”
伊利亚·卡根

3
@LowFlyingPelican Mono和.NET Framework不同。如果您查看.NET Framework版本,则实际上是完全不同的解决方案。
亚历克斯(Alex)

3
@LowFlyingPelican:.NET框架的原因性能。Mono实现该方法的原因是与.NET的API兼容性。Mono之所以以这种方式实现该方法,是因为实现简单(因为它们比Microsoft拥有更少的资源)。
2015年

4

语法糖。

处理文件路径时,很少有固定值是非常普遍的。在这些情况下,直接使用它们而不是必须将它们打包成一个数组更为方便。


3
使用params,您已经在做它了。msdn.microsoft.com/zh-cn/library/w5zay9db.aspx不需要数组。
Thomas Junk

3
在C#中,您有一个要点,@ Thomas。但是,.NET也支持不带.NET的其他语言params
Karl Bielefeldt 2015年

@ThomasJunk不幸的是,该链接对我而言是无效的,但是我确信您是正确的,因为我的C#中等。我刚刚看到许多库具有多种语言,这样做只是为了使代码更简洁。
弄死了机器人,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.