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

时间:2014-03-07 05:44:05

标签: 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);

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

5 个答案:

答案 0 :(得分:102)

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

delegate void E(string format, object o1);
E e = Console.WriteLine;

params重载不会满足这种情况,只有在存在此特定重载时才会起作用

public static void WriteLine(string format, object arg0);

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

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

答案 1 :(得分:37)

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

答案 2 :(得分:4)

我想你们所有人都忘了在C#2.0中引入了params。因此,当params关键字没有时,.NET 1.1也存在重载。

答案 3 :(得分:1)

我认为所提出的问题已经由JaredParjaket提供了良好的解释性答案,但有一点我认为也是相关的,

我认为用户的易用性和自由度根据需要使用上述任何功能,在那里,需要更方便而不是强加它们来创建一个数组,当他们真的不需要它时。

我认为过去我开始学习C#我几乎不使用数组并使用数组对我来说是一项复杂的任务,分配它然后用适当的值初始化它们是非常复杂和耗时...

答案 4 :(得分:-3)

这不是真正的性能问题。但是,提高可用性是其背后的正当理由。

下面的代码会给你一个小小的见解。

public class TipCalculator {
    private const double tipRate = 0.18;
    public static int Main(string[] args) {
        double billTotal;
        if (args.Length == 0) {
            Console.WriteLine("usage: TIPCALC total");
            return 1;
        }
        else {
            try {
                billTotal = Double.Parse(args[0]);
            }
            catch(FormatException) {
                Console.WriteLine("usage: TIPCALC total");
                return 1;
            }
            double tip = billTotal * tipRate;
            Console.WriteLine();
            Console.WriteLine("Bill total:\t{0,8:c}", billTotal);
            Console.WriteLine("Tip total/rate:\t{0,8:c} ({1:p1})", tip, tipRate);
            Console.WriteLine(("").PadRight(24, '-'));
            Console.WriteLine("Grand total:\t{0,8:c}", billTotal + tip);
            return 0;
        }
    }
}

请参阅链接:http://msdn.microsoft.com/en-us/library/aa324774(v=vs.71).aspx 了解更多信息。