2009-06-03 8 views
5

Utilizzando riflettore ottengo il seguente output:A cosa servono questi codici?

.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 
} 

per

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

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

Che cosa significano le linee 11-14 fanno? Chiamo una funzione e ottengo un risultato (riga 7). Lascio il risultato al giusto returntype (riga c) - perché non tornare in questo momento?

In qualche modo, il risultato del cast viene memorizzato come variabile locale - quindi c'è un salto non significativo alla riga successiva, dove la variabile locale viene caricata di nuovo. Perché?

Secondo la mia opinione la riga 11-14 e la variabile locale può essere omessa ...?

+1

FYI, il mio articolo sul blog salirà l'11. –

+0

Grazie per le informazioni ... Avrò un'occhiata – tanascius

+5

Ecco il link: http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do .aspx –

risposta

13

Sembra un build DEBUG, che lascia in IL in più per aiutare il debugger. Provalo di nuovo in RILASCIO e dovrebbe sembrare più pulito, con ottimizzazione ecc.

.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ì, è perfettamente logico memorizzare il risultato localmente per una build di debug - grazie – tanascius

+0

Per essere chiari, questo si verifica quando si costruisce con l'opzione optimice, non con debug +, sebbene la build Debug predefinita li imposti entrambi. – Lucas

+0

Vorrei che il blog di Eric fosse arrivato prima ;-p –

4

È una build di debug? È possibile che sia lì per il debugger.

Ho visto cose simili in altri posti - è quasi sempre innocuo però. Non dimenticare che la maggior parte dell'ottimizzazione è fatta dal JIT, che può notare cose del genere abbastanza facilmente. L'unico lato negativo è che più IL accenna al JIT che il metodo non dovrebbe essere sottolineato.

Problemi correlati