关于“.WriteLine()是否需要这么多重载”的笔记
来源:未知 责任编辑:责任编辑 发表时间:2014-03-23 22:25 点击:次
在Stack Overflow上看到一个较热门的问题,作笔记于此。
p>Console.WriteLine()有以下如此多的重载:
p>1 public static void WriteLine(string format, params object[] arg);
p>2 public static void WriteLine(string format, object arg0);
p>3 public static void WriteLine(string format, object arg0, object arg1);
p>4 public static void WriteLine(string format, object arg0, object arg1, object arg2);
p>5 public static void WriteLine(string format, object arg0, object arg1, object arg2, object arg3);
p>第一个重载能够替代后面的所有重载,为什么还需要后面的重载呢?
p>JaredPar给出了相关解答:
p>1. params参数无法在间接方法绑定中自由的使用,如以下代码:
p>delegate void E(string format, object o1);
p>E e = Console.WriteLine;
p>如在之后按params重载的思路,使用e("{0}, {1}", "a", "b")将无法编译通过。对于指定参数的委托,如需要使用到WriteLine,非params的重载是应该存在的;
p>
p>2. 并非所有的CLI都支持params的语法;
p>
p>3. 从性能的角度来说,每次调用public static void WriteLine(string format, params object[] arg),都将分配托管堆空间用于存储对象,哪怕是如下代码:
p>
p>
p>
p>复制代码
p>static void Main(string[] args)
p>{
p> DemoFunc("a", "b", "c");
p> DemoFunc("a", "b", "c");
p>}
p>
p>public static void DemoFunc(params string[] val)
p>{
p>}
p>复制代码
p>复制代码
p>.method private hidebysig static void Main(string[] args) cil managed
p>{
p> .entrypoint
p> // 代码大小 78 (0x4e)
p> .maxstack 3
p> .locals init ([0] string[] CS$0$0000)
p> IL_0000: nop
p> IL_0001: ldc.i4.3
p> IL_0002: newarr [mscorlib]System.String
p> IL_0007: stloc.0
p> IL_0008: ldloc.0
p> IL_0009: ldc.i4.0
p> IL_000a: ldstr "a"
p> IL_000f: stelem.ref
p> IL_0010: ldloc.0
p> IL_0011: ldc.i4.1
p> IL_0012: ldstr "b"
p> IL_0017: stelem.ref
p> IL_0018: ldloc.0
p> IL_0019: ldc.i4.2
p> IL_001a: ldstr "c"
p> IL_001f: stelem.ref
p> IL_0020: ldloc.0
p> IL_0021: call void ConsoleApplicationDemo2.Program::DemoFunc(string[])
p> IL_0026: nop
p> IL_0027: ldc.i4.3
p> IL_0028: newarr [mscorlib]System.String
p> IL_002d: stloc.0
p> IL_002e: ldloc.0
p> IL_002f: ldc.i4.0
p> IL_0030: ldstr "a"
p> IL_0035: stelem.ref
p> IL_0036: ldloc.0
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>