2011-03-17 9 views
11

जब मैं निष्पादन योग्य कोड में एक अभिव्यक्ति संकलित करता हूं और प्रतिनिधि प्राप्त करता हूं - क्या इस प्रतिनिधि के संदर्भ में कोई संदर्भ नहीं होने पर कोड को कचरा इकट्ठा किया जाता है?अभिव्यक्ति <TDelegate> कॉम्पाइल और कचरा संग्रह

क्या इस पर कोई दस्तावेज है? क्योंकि मुझे एमएसडीएन में कुछ भी उपयोगी नहीं मिला।

उत्तर

11

हां, कोड कचरा एकत्र किया जा सकता है। जब आप टी के अभिव्यक्ति पर संकलन कहते हैं, तो कोड को DynamicMethod में संकलित किया जाता है, और वे कचरा संग्रहण के लिए योग्य हैं।

वास्तव में यह MSDN पर संकेत दिया नहीं कर रहा है, लेकिन आप अभिव्यक्ति डीएलआर, जिसमें < टी > .Compile के कार्यान्वयन पर एक नज़र हो सकता है क्या 4.0 जहाजों शुद्ध:

http://dlr.codeplex.com/SourceControl/changeset/view/54115#990638

हालांकि कंपाइलर का कार्यान्वयन .NET 3.5 में भिन्न था, डायनेमिक मोड का उपयोग अभी भी किया गया था (स्रोत: स्वयं, मैंने सिस्टम लागू किया। मोनो में लिंक्स.एक्सप्रेस)।

जिस मामले में संकलित अभिव्यक्ति पेड़ एकत्रित नहीं होते हैं, वह तब होता है जब आप Expression<T>CompileToMethod का उपयोग करते हैं, और आप एक असेंबलीबिल्डर से मेथडबिल्डर पास करते हैं जो RunAndCollect ध्वज के साथ नहीं बनाया गया था।

+0

पर्याप्त गतिशील मोड का उपयोग कर रहा है? एरिक द्वारा प्रदान किए गए लिंक के अनुसार, http://msdn.microsoft.com/en-us/library/dd554932.aspx, असेंबली को एक विशेष ध्वज के साथ बनाया जाना चाहिए। परावर्तक में मैं देख सकता हूं कि विधि DynamicMethod.GetDynamicMethodsModule() RunAndCollect के साथ एक असेंबली नहीं बनाता है लेकिन केवल रन के साथ। – Alex

+0

हां, एक डायनामिक मोड पर्याप्त है, और यह एमएसडीएन में इंगित किया गया है। डायनामिक मोड में सीएलआर में विशेष हैंडलिंग है, और वास्तव में संग्रहित हैं। –

+0

हां, मैं इसे अब डायनामिक मोड क्लास के दस्तावेज़ में देख सकता हूं। धन्यवाद :) – Alex

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