2011-11-08 30 views
5

tôi đã viết programm rất cơ bản này để kiểm tra những gì trình biên dịch đang làm đằng sau hậu trường:Không thể nhìn thấy cách trình biên dịch sử dụng các lớp anh tạo ra cho đóng cửa của tôi

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

Bây giờ khi tôi nhìn vào mã với phản xạ tôi thấy rằng trình biên dịch tạo ra một lớp học cho việc đóng cửa của tôi như thế:

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

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

đó là tốt và tôi biết rằng anh ta cần phải làm điều đó để xử lý đóng cửa của tôi. Tuy nhiên, những gì tôi không thể thấy là làm thế nào anh ta thực sự đang sử dụng lớp này. Tôi có nghĩa là tôi sẽ có thể tìm thấy mã mà instantiates "<> c__DisplayClass1" một nơi nào đó, tôi có sai?

EDIT

Nếu tôi nhấp vào phương pháp tăng có vẻ như rằng:

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

bạn có thể đăng phần còn lại của mã được biên dịch không? Đặc biệt là phương pháp chính của bạn. – dowhilefor

+0

@dowhilefor: Phương pháp chính thực sự sẽ khá nhàm chán. Nó chỉ gọi một phương thức để có được một đại biểu, gọi người đại diện một vài lần và in ra các kết quả, sau đó gọi 'Console.ReadLine'. –

Trả lời

4

Bạn nên tìm thấy nó trong các phương pháp Increase, mà tôi mong đợi để có một thực hiện cùng những dòng:

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

Trình phản chiếu sẽ không hiển thị cho bạn mã đó trừ khi bạn tắt tối ưu hóa, nhưng nên ở đó. Hoặc tắt tối ưu hóa của Reflector, hoặc sử dụng ildasm.

+0

Tôi mong đợi nó sẽ trông như thế nhưng không. Tôi có cần phải có một phiên bản thương mại của phản xạ để xem nó? – Christoph

+0

Xin lỗi về việc kết xuất ong nhưng làm thế nào để tôi tối ưu hóa nó? Tôi không thể tìm thấy nó. Tôi đang sử dụng Resharper 6.8.2.5 btw. – Christoph

+0

@Cristoph: Chỉ cần tắt tối ưu hóa của Reflector thường làm việc cho tôi (hoặc thiết lập mức độ xuống .NET 1.1). Bạn đã thử chỉ cần nhìn vào IL thay vào đó? –

Các vấn đề liên quan