2011-11-08 4 views
5
내가 컴파일러가 내부적으로 무엇을하고 있는지 검사하기 위해 매우 기본적인 programm에 쓴

: 나는 코드를 볼 때 이제는 볼 수 없습니다

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

괜찮

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

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

을 나는 그가 그 내 마감을 처리하기 위해해야 ​​할 필요가 있음을 알고 있어요 : 반사판 나는 컴파일러가 그런 내 폐쇄 클래스를 생성하는 것을 볼 수 없습니다. 그러나 내가 볼 수없는 것은 그가 실제로이 클래스를 사용하는 방법입니다. 내가 "<> c__DisplayClass1"을 인스턴스화하는 코드를 찾을 수 있어야한다는 뜻인가요? 내가 증가 방법을 클릭하면

편집

는 그 다음과 같습니다

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

나머지 코드를 게시 할 수 있습니까? 특히 당신의 Main 방법. – dowhilefor

+0

@dowhilefor : Main 메서드는 실제로 꽤 지루합니다. 델리게이트를 몇 번 호출하고 결과를 출력 한 다음 Console.ReadLine을 호출하여 델리게이트를 가져 오는 메소드를 호출하는 것입니다. –

답변

4

당신은 내가이 함께 구현을 가지고 기대할 수 Increase 방법에서 찾을한다 줄 :

// 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의 최적화를 끄거나 ildasm을 사용하십시오.

+0

나는 그렇게 보이기를 기대하지만 그렇지 않습니다. 그것을 보시려면 상용 버전의 반사경이 필요합니까? – Christoph

+0

beeing dump에 대해 유감스럽게 생각하지만 어떻게 최적화를해야합니까? 나는 그것을 발견 할 수 없다. 나는 Resharper 6.8.2.5 btw를 사용하고 있습니다. – Christoph

+0

@Cristoph : Reflector의 최적화를 끄는 것은 보통 나를 위해 (또는 .NET 1.1로 레벨을 낮추는) 효과가있었습니다. 대신 일리노이를 보았습니까? –

관련 문제