同是两段代码:
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效率会高出很多.