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)总是会保存取消装箱吗?
答案 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您正在调用的方法。