在Stack Overflow上看到一个较热门的问题,作笔记于此。
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);
第一个重载能够替代后面的所有重载,为什么还需要后面的重载呢?
JaredPar给出了相关解答:
1.  params参数无法在间接方法绑定中自由的使用,如以下代码:
delegate void E(string format, object o1);
E e = Console.WriteLine;

如在之后按params重载的思路,使用e("{0}, {1}", "a", "b")将无法编译通过。对于指定参数的委托,如需要使用到WriteLine,非params的重载是应该存在的;

2.  并非所有的CLI都支持params的语法;

3.  从性能的角度来说,每次调用public static void WriteLine(string format, params object[] arg),都将分配托管堆空间用于存储对象,哪怕是如下代码:

  

static void Main(string[] args)
{
DemoFunc("a", "b", "c");
DemoFunc("a", "b", "c");
} public static void DemoFunc(params string[] val)
{
}
.method private hidebysig static void  Main(string[] args) cil managed
{
.entrypoint
// 代码大小 78 (0x4e)
.maxstack
.locals init ([] string[] CS$$)
IL_0000: nop
IL_0001: ldc.i4.
IL_0002: newarr [mscorlib]System.String
IL_0007: stloc.
IL_0008: ldloc.
IL_0009: ldc.i4.
IL_000a: ldstr "a"
IL_000f: stelem.ref
IL_0010: ldloc.
IL_0011: ldc.i4.
IL_0012: ldstr "b"
IL_0017: stelem.ref
IL_0018: ldloc.
IL_0019: ldc.i4.
IL_001a: ldstr "c"
IL_001f: stelem.ref
IL_0020: ldloc.
IL_0021: call void ConsoleApplicationDemo2.Program::DemoFunc(string[])
IL_0026: nop
IL_0027: ldc.i4.
IL_0028: newarr [mscorlib]System.String
IL_002d: stloc.
IL_002e: ldloc.
IL_002f: ldc.i4.
IL_0030: ldstr "a"
IL_0035: stelem.ref
IL_0036: ldloc.
IL_0037: ldc.i4.
IL_0038: ldstr "b"
IL_003d: stelem.ref
IL_003e: ldloc.
IL_003f: ldc.i4.
IL_0040: ldstr "c"
IL_0045: stelem.ref
IL_0046: ldloc.
IL_0047: call void ConsoleApplicationDemo2.Program::DemoFunc(string[])
IL_004c: nop
IL_004d: ret
} // end of method Program::Main
从IL中可以看出,.NET都会重复分配托管堆空间。在此,由于程序较为简单,对于GC的压力较小,但当程序趋于复杂时,过多的分配托管堆空间对GC的压力是很大的,而GC往往会成为复杂程序效率的瓶颈。

关于“.WriteLine()是否需要这么多重载”的笔记的更多相关文章

  1. 初步C++运算符重载学习笔记<3> 增量递减运算符重载

    初步C++运算符重载学习笔记<1> 初探C++运算符重载学习笔记<2> 重载为友元函数     增量.减量运算符++(--)分别有两种形式:前自增++i(自减--i).后自增i ...

  2. 初探C++运算符重载学习笔记&lt;2&gt; 重载为友元函数

    初探C++运算符重载学习笔记 在上面那篇博客中,写了将运算符重载为普通函数或类的成员函数这两种情况. 以下的两种情况发生.则我们须要将运算符重载为类的友元函数 <1>成员函数不能满足要求 ...

  3. Java之方法重载(笔记)

    Java是根据参数类型和个数的不同实现重载. 1.当参数类型是基本类型,但不完全匹配. void test(int i) { } void test(float f) { } public stati ...

  4. C++对运算符进行重载学习笔记

    1.  一个类的成员函数是暗含着 this 指针的,eg; #include<iostream> using namespace std; class A{ public: A(){ x ...

  5. .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]

    方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...

  6. C#一元运算重载的深入理解

    using System; using System.Diagnostics; using System.Text; using System.Collections; using System.Co ...

  7. C#面向对象——方法的重载及构造函数、静态对象。

    namespace nameclass2 { class Class2 //方法的重载 { public void Function( string s) { Console.WriteLine(s) ...

  8. [你必须知道的.NET]第十七回:貌合神离:覆写和重载

    本文将介绍以下内容: 什么是覆写,什么是重载 覆写与重载的区别 覆写与重载在多态特性中的应用 1. 引言 覆写(override)与重载(overload),是成就.NET面向对象多态特性的基本技术之 ...

  9. C#知识点记录

    用于记录C#知识要点. 参考:CLR via C#.C#并发编程.MSDN.百度 记录方式:读每本书,先看一遍,然后第二遍的时候,写笔记. CLR:公共语言运行时(Common Language Ru ...

随机推荐

  1. 区块链中的密码学(二)-RSA算法分析和实现

    密码学领域中,加密算法主要分为对称加密和非对称加密,随着信息时代安全性要求越来越高,对称加密因为其易被破解的原因逐渐被舍弃.而RSA算法是目前密码学世界中比较流行的非对称加密算法,命名是根据其发明者R ...

  2. Shell脚本标准

    #!/bin/bash #Usage: # ./shell.sh dbname user passwd #----------------------------------------------- ...

  3. flink学习笔记-各种Time

    说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...

  4. C++基础学习8:类的定义(class)

    先来说说C和C++中结构体的不同 a) C语言中的结构体不能为空,否则会报错(??) b) C语言中内存为空结构体分配大小为0,C++中为结构体和类分配大小为1byte c) C语言中的结构体只涉及到 ...

  5. 小程序scroll-view采坑

    scroll-view分为水平滚动和垂直滚动.注意滚动视图垂直滚动时一定要设置高度否则的话scroll-view不会生效.

  6. ubuntu14.04 apt-get install找不到软件,更换源解决

    安装14.04后,有时使用apt-get命令安装程序,会提示找不到程序,这是因为软件源不正确,网上说的换163的.中科大的.阿里的等等,我在更新源的时候都会出错,一般是报404错误,网上也没找到好的办 ...

  7. PhpStrom 和 wamp 配置 xdebug

    本地服务器: 1.php.ini  添加内容: ;设置xdebug的端口为9000 xdebug.remote_handler = dbgp xdebug.remote_host= localhost ...

  8. 关于c语言的位运算&,|,^(看懂汉字的都能看懂)

    其中|,&可以当作逻辑运算符,当|,&当成逻辑运算符时,与||,&&的用法基本相似,&&,||运算时会当前面的表达式能够决定整个表达式,则不进行对后面的 ...

  9. HMAC算法加密

    /** * HMAC算法加密 * @param message 待加密信息 * @param key 密钥 * @return */ public static String HmacSHA256(b ...

  10. Go语言基础之16--Mysql基本操作

    一.Mysql驱动及数据库连接 1.1 Golang中的Mysql驱动 A. https://github.com/go-sql-driver/mysql B. Go本身不提供具体数据库驱动,只提供驱 ...