2009-06-03 21 views
5

Usando reflector me sale el siguiente resultado:¿Para qué son estos códigos de operación?

.method private hidebysig static class myModelTestarea.Foo Method() cil managed 
{ 
    .maxstack 1 
    .locals init ([0] class myModelTestarea.Foo CS$1$0000) 
    L_0000: nop 
    L_0001: ldc.i4.0 
    L_0002: newarr object 
    L_0007: call object myModelTestarea.Program::Resolve(object[]) 
    L_000c: castclass myModelTestarea.Foo 
    L_0011: stloc.0 
    L_0012: br.s L_0014 
    L_0014: ldloc.0 
    L_0015: ret 
} 

para

private static Foo Method() 
{ 
    return (Foo)Resolve(); 
} 

private static object Resolve(params object[] args) 
{ 
    return new Foo(); 
} 

¿Qué significan las líneas 11-14 hacen? Llamo a una función y obtengo un resultado (línea 7). Eché el resultado al tipo de devolución correcto (línea c). ¿Por qué no regresar ahora mismo?

De alguna manera, el resultado arrojado se almacena como una variable local, luego hay un salto no-colateral a la siguiente línea, donde la variable local se carga nuevamente. ¿Por qué?

En mi opinión, la línea 11-14 y la variable local se pueden omitir ...?

+1

FYI, el artículo de mi blog sobre esto subirá el día 11. –

+0

Gracias por la información ... Voy a echar un vistazo – tanascius

+5

Aquí está el enlace: http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do .aspx –

Respuesta

13

Parece una creación DEBUG, que deja IL adicional para ayudar al depurador. Pruébalo de nuevo en RELEASE y debería verse más limpio, con optimización, etc.

.method private hidebysig static class program/Foo Method() cil managed 
{ 
    .maxstack 8 
    L_0000: ldc.i4.0 
    L_0001: newarr object 
    L_0006: call object program::Resolve(object[]) 
    L_000b: castclass program/Foo 
    L_0010: ret 
} 
+0

Sí, tiene sentido almacenar el resultado localmente para una compilación de depuración - gracias – tanascius

+0

Para que quede claro, esto ocurre cuando compilamos con la opción optimize, no depuración +, aunque la compilación Debug predeterminada establece ambas. – Lucas

+0

Ojalá el blog de Eric hubiera venido antes ;-p –

4

¿Es esto una creación de depuración? Es posible que esté allí por el depurador.

He visto cosas similares en otros lugares; sin embargo, casi siempre es inofensivo. No olvide que la mayor parte de la optimización es realizada por el JIT, que puede notar cosas como esta con la suficiente facilidad. El único inconveniente es que más IL alusión al JIT que el método no debe estar en línea.

Cuestiones relacionadas