2011-11-08 17 views
5

Ho scritto questo programma molto semplice per esaminare ciò che il compilatore sta facendo dietro le quinte:Non riesco a vedere come il compilatore utilizza le classi che crea per le mie chiusure

class Program 
{ 
    static void Main(string[] args) 
    { 
     var increase = Increase(); 
     Console.WriteLine(increase()); 
     Console.WriteLine(increase()); 
     Console.ReadLine(); 
    } 

    static Func<int> Increase() 
    { 
     int counter = 0; 
     return() => counter++; 
    } 
} 

Ora, quando guardo il codice con Riflettore vedo che il compilatore genera una classe per la mia chiusura così:

[CompilerGenerated] 
private sealed class <>c__DisplayClass1 
{ 
    // Fields 
    public int counter; 

    // Methods 
    public int <Increase>b__0() 
    { 
     return this.counter++; 
    } 
} 

che va bene e mi rendo conto che ha bisogno di fare che per gestire il mio chiusura. Tuttavia, quello che non riesco a vedere è come sta effettivamente usando questa classe. Voglio dire che dovrei essere in grado di trovare il codice che crea un'istanza "<> c__DisplayClass1" da qualche parte, sbaglio?

EDIT

Se clicco sul metodo aumento Sembra che:

private static Func<int> Increase() 
{ 
    int counter = 0; 
    return delegate { 
     return counter++; 
    }; 
} 
+0

potresti pubblicare il resto del codice compilato? Soprattutto il tuo metodo principale. – dowhilefor

+0

@dowhilefor: Il metodo Main sarebbe in realtà piuttosto noioso. È solo chiamando un metodo per ottenere un delegato, invocando il delegato un paio di volte e stampando i risultati, quindi chiamando 'Console.ReadLine'. –

risposta

4

si dovrebbe trovare nel metodo Increase, che mi aspetto di avere un'implementazione insieme questi righe:

// Not actually valid C# code because of the names... 
static Func<int> Increase() 
{ 
    <>c__DisplayClass1 closure = new c__DisplayClass1(); 
    closure.counter = 0; 
    return new Func<int>(closure.<Increase>b__0); 
} 

Reflector non ti mostrerà questo codice a meno che tu non disattivi la sua ottimizzazione, ma dovrebbe essere lì Disattiva l'ottimizzazione di Reflector o usa ildasm.

+0

Mi aspetterei che assomigli così ma non lo fa. Devo ottenere una versione commerciale del riflettore per vederlo? – Christoph

+0

Ci scusiamo per esserci discarica, ma come posso disattivare la sua ottimizzazione? Non riesco a trovarlo Sto usando Resharper 6.8.2.5 btw. – Christoph

+0

@Cristoph: basta disattivare l'ottimizzazione di Reflector che di solito ha funzionato per me (o impostando il livello su .NET 1.1). Hai provato a guardare invece l'IL? –

Problemi correlati