Console.WriteLine()和需要这么多的参数重载?
我正在浏览文档,注意到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);
这似乎是多余的。 第一个重载的其他四个重载的需求是什么? 第一种方法能够完成其他方法所能做的一切。 是否有一个性能问题,他们试图通过提供额外的重载来处理,最多可以处理四个参数(最后一个)? 通过一个最多四个参数的数组的开销是否足以提供这些重载的需要?
一般来说,你是正确的,第一个重载可以满足其他重载。 这不是严格的,虽然因为params
关键字不能用于间接的情况,如方法组绑定。 例如
delegate void E(string format, object o1); E e = Console.WriteLine;
params
重载不会满足这种情况,只有当这个特定的重载时才会起作用
public static void WriteLine(string format, object arg0);
这是一个相当深奥的情况,虽然。 更重要的原因如下
- 并非每一种CLI语言都需要支持
params
关键字。 通过消除为简单的WriteLine调用手动创build数组的需要,具有重载减轻了这些语言的负担 - 性能。 调用
params
过载会强制调用者分配一个数组,即使它是由编译器隐式地完成的。 分配在.Net中便宜,但不是免费的。 像这样的小东西加起来很快,特别是通常称为Console.WriteLine
方法。 有其他重载允许常见的情况下,以避免这种分配
重载是为了方便C ++ / CLI程序,其中params关键字不存在。
我想大家都忘记了C#2.0中引入了params。 因此,在.NET 1.1中,当params关键字没有的时候,重载也是存在的。
我想问的问题已经由JaredPar和jaket做了很好的说明性的解答,但我认为也有一点可以相关,
我觉得用户易用性和自由度是根据用户要求使用上述任何一种function的,这样就有了方便,而不用强制它们去创build一个数组,当他们真的不需要的时候。
我也想起了过去当我开始学习C#的时候, 我很less使用数组 ,对于我来说,使用数组是一项复杂的任务,分配它,然后用适当的值初始化它们真的很复杂,也很费时。
这不是真正的性能问题。 但是,提高可用性是其背后的一个有效原因。
下面的代码会给你一个小洞察。
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获取更多信息。