C# 装箱原型

同是两段代码:

      string str="str"+9;

      string str1="str"+9.ToString();

前者在IL中查看是,会发生一次Box装箱操作,后者没有发生装箱,原因是调用了整型的ToString方法.ToString方法的原型为:

        Public override String ToString()

        {

            return Number.FormatInt32(m_value,null,NumberFormatInfo.CurrentInfo);

        }

ToString是直接通过操作内存来完成从Int和String类型转换的,所以后者并没有发生装箱.

另外通过跟踪可知:装箱操作之所以会带来性能上的损失,因为它需要完成以下几个步骤:

        首先:它会给值类型在托管堆中分配内存.除了值类型本身所分配的内存外,内存总量还要加上类型对象指针和同步块索引所占用的内存.

        然后:将值类型的值复制到新分配的堆内存中

        最后:返回已经成为引用类型的对象的地址

另外string类型本身就是一个比较特殊的类型,它一旦赋值之后,在内存堆中的值就不会改变,从而对于要使用大量的字符时,使用stringbuilder效率会高出很多.

原文地址:https://www.cnblogs.com/MR-LIUB/p/3448407.html