2011-11-08 14 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

क्या आप शेष संकलित कोड पोस्ट कर सकते हैं? विशेष रूप से आपकी मुख्य विधि। – dowhilefor

+0

@dowhilefor: मुख्य विधि वास्तव में बहुत उबाऊ होगी। यह सिर्फ एक प्रतिनिधि को पाने के लिए एक तरीका बुला रहा है, प्रतिनिधि को दो बार आमंत्रित करता है और परिणामों को प्रिंट करता है, फिर 'कंसोल। रीडलाइन' को कॉल करता है। –

उत्तर

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

परावर्तक आपको उस कोड को तब तक नहीं दिखाएगा जब तक कि आप इसका अनुकूलन बंद नहीं करते, लेकिन इसे वहाँ रहना। या तो परावर्तक के अनुकूलन को बंद करें, या ildasm का उपयोग करें।

+0

मैं इसे ऐसा दिखने की उम्मीद करता हूं लेकिन ऐसा नहीं करता है। क्या मुझे इसे देखने के लिए परावर्तक का व्यावसायिक संस्करण प्राप्त करने की आवश्यकता है? – Christoph

+0

मधुमक्खी डंप के लिए खेद है, लेकिन मैं इसके अनुकूलन को कैसे बदलूं? मुझे यह नहीं मिल रहा है। मैं Resharper 6.8.2.5 बीटीडब्ल्यू का उपयोग कर रहा हूँ। – Christoph

+0

@ क्रिस्टोफ: रिफ्लेक्टर के अनुकूलन को बंद करना आम तौर पर मेरे लिए काम करता है (या स्तर को .NET 1.1 पर सेट करना)। क्या आपने इसके बजाय आईएल को देखने की कोशिश की है? –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^