Console.WriteLine()和需要这么多的参数重载?

B.K*_*.K. 86 c#

我正在浏览文档并注意到该Console.WriteLine()方法有几个重载.特别是,我的好奇心和部分混淆与这些有关:

public static void WriteLine(string format, params object[] arg);
public static void WriteLine(string format, object arg0);
public static void WriteLine(string format, object arg0, object arg1);
public static void WriteLine(string format, object arg0, object arg1, object arg2);
public static void WriteLine(string format, object arg0, object arg1, object arg2, object arg3);
Run Code Online (Sandbox Code Playgroud)

这似乎是多余的.第一个超载的其他四个重载需要什么?第一种方法能够完成其他方法可以做的所有事情.是否有一个性能问题,他们试图通过提供额外的重载来处理,最多可以处理四个参数(最后一个)?通过最多四个参数的数组的开销是否足以满足这些重载的需要?

Jar*_*Par 102

一般来说,第一次重载足以满足其他重载是正确的.但这并不严格,因为params关键字不能用于方法组绑定等间接情况.例如

delegate void E(string format, object o1);
E e = Console.WriteLine;
Run Code Online (Sandbox Code Playgroud)

所述params过载不会满足该情况下,它将只当这个特定的过载是本工作

public static void WriteLine(string format, object arg0);
Run Code Online (Sandbox Code Playgroud)

这是一个非常深奥的案例.更重要的原因如下

  1. 并非每种CLI语言都支持该params关键字.通过消除为简单的WriteLine`调用手动创建数组的需要,具有重载可以减轻这些语言的负担
  2. 性能.调用params重载会强制调用者分配一个数组,即使它是由编译器隐式完成的.分配在.Net中很便宜但不是免费的.像这样的小事情很快就会加起来,特别是在常见的方法上Console.WriteLine.具有其他重载允许常见情况避免这种分配

  • 数组分配是否因Console.WriteLine的速度有多明显而引人注意? (4认同)
  • @insta它不是速度,而是积累的分配问题.GC很便宜并不是免费的,在复杂的应用程序中GC通常是主要的性能因素.停止不必要分配的常见来源对性能很重要 (3认同)

jak*_*ket 37

重载是为了方便C++/CLI程序,其中params关键字不存在.

  • 基础知识从第一语言开始,聪明的回答伙伴 (3认同)