2011-11-08 10 views
5
Ben derleyici perde arkasında ne yaptığını incelemek için bu çok temel programm yazdı

: Ben kodu ile baktığınızda Şimdigöremiyorum

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

gayet

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

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

ve ben o benim kapatılmasını işlemek için yapması gereken farkındayım: reflektör Ben derleyici böyle benim kapatılması için bir sınıf oluşturduğu görüyoruz. Ancak, göremediğim şey bu sınıfı nasıl kullandığıdır. Demek istediğim, "<> c__DisplayClass1" yi örnekleyen bir kodu bulabilmem gerekir, yanlış mıyım? Ben artış yöntemine tıklarsanız

DÜZENLEME

öyle gibi gözüküyor:

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

Derlenmiş kodun geri kalanını gönderebilir misiniz? Özellikle ana yönteminiz. – dowhilefor

+0

@dowhilefor: Ana yöntem aslında oldukça sıkıcı olurdu. Bir temsilci almak, delegeyi birkaç kez çağırmak ve sonuçları yazdırmak, ardından da Console.ReadLine işlevini çağırmak için bir yöntem çağırıyor. –

cevap

4

Sen Bunları boyunca bir uygulama olmasını beklediğiniz Increase yöntemde, bunu bulmak gerekir satırları:

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

Reflektör, optimizasyonunu kapatmazsanız bu kodu size göstermez, ancak orada ol. Reflector'un optimizasyonunu kapatın ya da ildasm kullanın.

+0

Bunun gibi görünmesini beklerdim ama olmaz. Görmek için reflektörün ticari bir versiyonunu almam gerekir mi? – Christoph

+0

Arı dökümü için özür dilerim, ancak optimizasyonunu nasıl değiştirebilirim? Onu bulamıyorum. Resharper 6.8.2.5 btw kullanıyorum. – Christoph

+0

@Cristoph: Reflector'un optimizasyonunu kapatmak sadece benim için çalıştı (ya da seviyeyi .NET 1.1'e düşürdü). Bunun yerine sadece IL'ye bakmayı denediniz mi? –

İlgili konular