直接声明和初始化返回代码之间有什么区别吗?

时间:2016-11-16 18:09:17

标签: c#

之间有什么区别:

public CustomObject MyMethod() 
{
    var myObject = new CustomObject();
    return myObject
}

public int MyIntMethod() 
{
    var myInt = 1;
    return myInt;
}

到此:

public CustomObject MyMethod() 
{
    return new CustomObject();
}

public int MyIntMethod() 
{
    return 1;
}

编译器是否做了不同的事情?像空检查或类似的东西?

2 个答案:

答案 0 :(得分:0)

编译器单独谈话更新:(编译时没有优化,优化后编译的代码是相同的,感谢评论。):

public CustomObject MyMethod() 
{
    var myObject = new CustomObject();
    return myObject
}

            var myObject = new CustomObject();
01933516  mov         ecx,58413C4h  
0193351B  call        014D30F4  
01933520  mov         dword ptr [ebp-44h],eax  
01933523  mov         ecx,dword ptr [ebp-44h]  
01933526  call        01930D10  
0193352B  mov         eax,dword ptr [ebp-44h]  
0193352E  mov         dword ptr [ebp-3Ch],eax  
            return myObject;
01933531  mov         eax,dword ptr [ebp-3Ch]  
01933534  mov         dword ptr [ebp-40h],eax  
01933537  nop  
01933538  jmp         0193353A 

VS

public CustomObject MyMethod() 
{
    return new CustomObject();
}

            return new CustomObject();
00FD2E11  mov         ecx,4E70F48h  
00FD2E16  call        00A830F4  
00FD2E1B  mov         dword ptr [ebp-40h],eax  
00FD2E1E  mov         ecx,dword ptr [ebp-40h]  
00FD2E21  call        00FD0D10  
00FD2E26  mov         eax,dword ptr [ebp-40h]  
00FD2E29  mov         dword ptr [ebp-3Ch],eax  
00FD2E2C  nop  
00FD2E2D  jmp         00FD2E2F  

第一种方法有11种装配说明,第二种方法有9种装配说明。有更多的指针内存操作。

答案 1 :(得分:0)

  

编译器是否做了不同的事情?像空检查或   类似的东西?

这取决于您是否启用了优化。编译器不执行空检查。

生产代码通常在启用优化的情况下编译,因此编写代码的方式并不重要。

使用局部变量:

IL_0000:  nop         
IL_0001:  ret         

MyMethod:
IL_0000:  nop         
IL_0001:  newobj      UserQuery+CustomObject..ctor
IL_0006:  stloc.0     // myObject
IL_0007:  ldloc.0     // myObject
IL_0008:  stloc.1     
IL_0009:  br.s        IL_000B
IL_000B:  ldloc.1     
IL_000C:  ret         

MyIntMethod:
IL_0000:  nop         
IL_0001:  ldc.i4.1    
IL_0002:  stloc.0     // myInt
IL_0003:  ldloc.0     // myInt
IL_0004:  stloc.1     
IL_0005:  br.s        IL_0007
IL_0007:  ldloc.1     
IL_0008:  ret         

CustomObject..ctor:
IL_0000:  ldarg.0     
IL_0001:  call        System.Object..ctor
IL_0006:  nop         
IL_0007:  ret         

没有局部变量,你得到:

IL_0000:  nop         
IL_0001:  ret         

MyMethod:
IL_0000:  nop         
IL_0001:  newobj      UserQuery+CustomObject..ctor
IL_0006:  stloc.0     
IL_0007:  br.s        IL_0009
IL_0009:  ldloc.0     
IL_000A:  ret         

MyIntMethod:
IL_0000:  nop         
IL_0001:  ldc.i4.1    
IL_0002:  stloc.0     
IL_0003:  br.s        IL_0005
IL_0005:  ldloc.0     
IL_0006:  ret         

CustomObject..ctor:
IL_0000:  ldarg.0     
IL_0001:  call        System.Object..ctor
IL_0006:  nop         
IL_0007:  ret         

使用编译器优化,无论如何都可以得到:

IL_0000:  ret         

MyMethod:
IL_0000:  newobj      UserQuery+CustomObject..ctor
IL_0005:  ret         

MyIntMethod:
IL_0000:  ldc.i4.1    
IL_0001:  ret         

CustomObject..ctor:
IL_0000:  ldarg.0     
IL_0001:  call        System.Object..ctor
IL_0006:  ret         
相关问题