Convert.ToInt32(对象)是否跳过拆箱?

时间:2014-04-16 23:00:37

标签: c# .net-4.0 unboxing

IL由以下产生:

object[] items = new object[] { 341, "qwerty" };
int item1FromConvert = Convert.ToInt32(items[0]);
int item1FromCast = (int)items[0];

是(根据LINQPad 4):

IL_0001:  ldc.i4.2    
IL_0002:  newarr      System.Object
IL_0007:  stloc.3     // CS$0$0000
IL_0008:  ldloc.3     // CS$0$0000
IL_0009:  ldc.i4.0    
IL_000A:  ldc.i4      55 01 00 00 
IL_000F:  box         System.Int32
IL_0014:  stelem.ref  
IL_0015:  ldloc.3     // CS$0$0000
IL_0016:  ldc.i4.1    
IL_0017:  ldstr       "qwerty"
IL_001C:  stelem.ref  
IL_001D:  ldloc.3     // CS$0$0000
IL_001E:  stloc.0     // items
IL_001F:  ldloc.0     // items
IL_0020:  ldc.i4.0    
IL_0021:  ldelem.ref  
IL_0022:  call        System.Convert.ToInt32
IL_0027:  stloc.1     // item1FromConvert
IL_0028:  ldloc.0     // items
IL_0029:  ldc.i4.0    
IL_002A:  ldelem.ref  
IL_002B:  unbox.any   System.Int32
IL_0030:  stloc.2     // item1FromCast

item1FromConvert似乎跳过了将object转换为int或任何值类型的典型拆箱阶段(根据我对IL的极为有限的理解 - 基于没有unbox.any为注释行上方的行:// item1FromConvert)。

确实是这种情况,如果对象是上述值类型,Convert.ToValueType(object)总是会保存取消装箱吗?

1 个答案:

答案 0 :(得分:3)

没有拳击,但你只是换了一个方法调用,这只是一种不同的方法。从性能角度来看,它并不能真正节省您的时间。您所做的只是调用Convert.ToInt32(object),其实现是:

 public static int ToInt32(object value) {
     return value == null? 0: ((IConvertible)value).ToInt32(null);
 }

(见这里:http://referencesource.microsoft.com/#mscorlib/system/convert.cs#3a271a647f117003

所以,如果有的话,由于Convert.ToInt32(object)的实施过程中发生了各种各样的操作,你实际上正在降低你的表现,如果你只是你就不会有把价值放在第一位。

您正在尝试进行微优化,并实际执行 IL指令的数量增加,因为LINQPad不会向您展示IL您正在调用的方法。