人还是比机器聪明

代码:
public int Add(int a, int b)
{
    int c = 100;
    return ((a + b) + c);
}
查看IL:
.method public hidebysig instance int32 Add(int32 a, int32 b) cil managed
{
    .maxstack 2
    .locals init (
        [0] int32 c,
        [1] int32 CS$1$0000)
    L_0000: nop 
    L_0001: ldc.i4.s 100
    L_0003: stloc.0 
    L_0004: ldarg.1 
    L_0005: ldarg.2 
    L_0006: add 
    L_0007: ldloc.0 
    L_0008: add 
    L_0009: stloc.1 
    L_000a: br.s L_000c
    L_000c: ldloc.1 
    L_000d: ret 
}
emit:
 var addMethod=tb.DefineMethod("Add", MethodAttributes.Public, CallingConventions.Standard, typeof(int), new Type[] { typeof(int), typeof(int) });
            addMethod.DefineParameter(1,ParameterAttributes.None,"a");
            addMethod.DefineParameter(2, ParameterAttributes.None, "b");
            var il2=addMethod.GetILGenerator();
            var lb=il2.DeclareLocal(typeof(int));
            lb.SetLocalSymInfo("c");
            il2.Emit(OpCodes.Ldc_I4, 100);
            il2.Emit(OpCodes.Stloc, 0);
            il2.Emit(OpCodes.Ldarg_1);
            il2.Emit(OpCodes.Ldarg_2);
            il2.Emit(OpCodes.Add);
            il2.Emit(OpCodes.Ldloc_0);
            il2.Emit(OpCodes.Add);
            il2.Emit(OpCodes.Ret);
查看:
IL:
.method public instance int32 Add(int32 a, int32 b) cil managed
{
    .maxstack 2
    .locals init (
        [0] int32 num)
    L_0000: ldc.i4 100
    L_0005: stloc num
    L_0009: nop 
    L_000a: nop 
    L_000b: ldarg.1 
    L_000c: ldarg.2 
    L_000d: add 
    L_000e: ldloc.0 
    L_000f: add 
    L_0010: ret 
}
代码:
public int Add(int a, int b)
{
    int num = 100;
    return ((a + b) + num);
}
是否说明编译器还不够聪明呢?没自己写的IL简单。另外明明声明的局部变量是c,如何变成num了?

 

你可能感兴趣的:(人还是比机器聪明)