2011-11-08 15 views
5

Napisałem ten bardzo prosty programm zbadać co kompilator robi za kulisami:nie widzę, w jaki sposób kompilator używa klas tworzy dla moich zamknięć

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++; 
    } 
} 

Teraz, gdy patrzę na kod z reflektor widzę, że kompilator generuje klasy dla mojego zamknięcia tak:

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

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

że jest w porządku i jestem świadomy, że musi to zrobić, aby obsłużyć mój zamknięcia. Jednak nie widzę, jak on faktycznie używa tej klasy. Chodzi mi o to, że powinienem znaleźć kod, który tworzy gdzieś "<> c__DisplayClass1", czy jestem w błędzie?

EDIT

Jeśli kliknę na metodzie wzrost wygląda na to, że:

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

Czy możesz wysłać resztę skompilowanego kodu? Szczególnie twoja główna metoda. – dowhilefor

+0

@dowhilefor: Metoda główna byłaby dość nudna. Po prostu wywołuje metodę uzyskania delegata, kilkakrotnego wywoływania delegata i drukowania wyników, a następnie wywoływania 'Console.ReadLine'. –

Odpowiedz

4

Powinieneś go znaleźć w metodzie Increase, co będę oczekiwać, aby mieć implementację wzdłuż tych linie:

// 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); 
} 

Reflektor nie wyświetli tego kodu, chyba że wyłączysz jego optymalizację, ale powinien bądź tam. Wyłącz optymalizację reflektora lub użyj ildazmu.

+0

Spodziewałbym się, że tak to wygląda, ale tak nie jest. Czy muszę uzyskać komercyjną wersję reflektora, aby ją zobaczyć? – Christoph

+0

Przepraszam za bład, ale jak mogę zmienić jego optymalizację? Nie mogę tego znaleźć. Używam Resharper 6.8.2.5 btw. – Christoph

+0

@Cristoph: Wyłączanie optymalizacji Reflector zwykle działa dla mnie (lub ustawienie poziomu do .NET 1.1). Czy próbowałeś po prostu patrząc na IL? –

Powiązane problemy