在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. LINQ和Lambda表达式

    前言 前段时间接触了一种新的表达式,但是不知道这个是什么意思,所以就先站在巨人的肩膀用了,现在听师哥说这种写法是Lambda表达式.我一直以为,这个Lambda表达式和LINQ查询有异曲同工之妙,可惜 ...

  2. 图片压缩工具之grunt-contrib-imagemin

    对页面进行优化时~免不了对使用的图片进行压缩~以便减小我们使用的图片的大小~这样就可以减少用户下载的文件大小,加快页面访问速度.Google Pagespeed最佳实践建议我们用 jpegtran 或 ...

  3. Eclipse中Spring插件的安装及使用

    一.安装流程 1.Help——Install New Software——在Work With中添加地址http://dist.springsource.com/release/TOOLS/updat ...

  4. 牛客寒假算法基础集训营4 F Applese 的QQ群

    链接:https://ac.nowcoder.com/acm/contest/330/F来源:牛客网 Applese 有一个QQ群.在这个群中,大家互相请教问题.如 b 向 a 请教过问题,就把 a ...

  5. 洛谷P2071 座位安排

    题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最 ...

  6. vue项目中使用了vw适配方案,引入第三方ui框架mint-ui时,适配问题解决

    问题分析: 一般第三方ui框架用的都是不同的适配方式,如果我们使用了vw适配,那么在使用mint-ui框架时,就会发现px单位会被转换成vw,从而导致样式变小的问题,如图 解决方案 网上看到了很多种解 ...

  7. centos6.4安装过程中无法出现图形化界面

    今天在VMware9.0安装centos6.4的时候,前面的步骤都没问题,到跳过媒体检查这一步后,就发现和之前的不一样了,这次安装不是图形界面,导致后面的安装不方便 一开始以为是centos的版本不一 ...

  8. 关于pycharm使用sqlite数据可视化的使用

    如图

  9. 傻瓜式Spring教学第二课

    什么是依赖注入 先说什么是依赖 如下: class A{ B b; } class B{ } 则称A依赖B. 依赖:A的某些业务逻辑需要B的参与,如果不对A中的参数b进行实例化,那么A中的某些业务逻辑 ...

  10. thinkPHP5.0获取器获取原始数据

    如果你定义了获取器的情况下,希望获取数据表中的原始数据,可以使用:$cate = Cate::get(1);// 通过获取器获取字段echo $cate->type;// 获取原始字段数据ech ...