3、返回已经成为引用类型的对象的地址。
在来看以下代码:
//没有发生装箱的代码
String boxOperate = "test" + 4.ToString();
其中间IL
IL_0000: nop
IL_0001: ldstr "test"
IL_0006: ldc.r4 4
IL_000b: stloc.1
IL_000c: ldloca.s 1
IL_000e: call instance string [mscorlib]System.Single::ToString()
IL_0013: call string [mscorlib]System.String::Concat(string, string)
IL_0018: stloc.0
IL_0019: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
IL_001e: pop
IL_001f: ret
如上,并没有发生任何装箱操作,但是达到的结果却是我们想要的。原因是 4.ToString() 这行代码并没有发生装箱行为,是实际调用的是整数型的ToString()方法,其原型如下:
public override string ToString(){
return Number.FormatInt32(m_value, null, NumberFormat.CurrentInfo);
}
可能有人会问,是不是原型中的 Number.Format_XXX方法会发生装箱行为呢?实际上,Number.Format_XXX方法是一个非托管的方法,其原型如下:
[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]
public statuc extern string FormatInt32(int value, string format,NumberFormatInfo info);
它是通过直接操作内存来完成 Int32 到 String 的转换,效率要比装箱高得多。所以,在使用其他值引用类型到字符串得转换比完成拼接时,应当避免使用操作符 “+” 来我完成,而应该使用值引用类型提供得ToString方法。
也许有人会问:即使FCL提供得方法没有发生装箱行为,但在其他情况下,FCL方法内部会不会含有装箱的行为?也许会存在,所以,本人推荐:编写代码中,应当尽量避免发生不必要的装箱代码。










