प्रतिनिधि को पिन होने की आवश्यकता नहीं है। एक प्रबंधित ऑब्जेक्ट पिन किया गया यदि यह कचरा कलेक्टर द्वारा स्थानांतरित नहीं किया जा सकता है। यदि मार्शलिंग जानकारी सही है तो मार्शलिंग परत यह सुनिश्चित करेगी कि कुछ इंपीबल के लिए पॉइंटर पास हो जाए।
हालांकि, ऊपर दी गई टिप्पणी जहां आप सुझाव देते हैं कि एक स्थानीय चर प्रतिनिधि जीवित रख सकता है परिवर्तनीय जीवनकाल की गलतफहमी को इंगित करता है। मैं आपको spec पर संदर्भित करता हूं, जिसमें कहा गया है:
स्थानीय चर का वास्तविक जीवनकाल कार्यान्वयन-निर्भर है। उदाहरण के लिए, एक कंपाइलर स्थिर रूप से निर्धारित कर सकता है कि ब्लॉक में एक स्थानीय चर केवल उस ब्लॉक के एक छोटे हिस्से के लिए उपयोग किया जाता है। इस विश्लेषण का उपयोग करके, कंपाइलर कोड उत्पन्न कर सकता है जिसके परिणामस्वरूप परिवर्तनीय भंडारण में इसके युक्त ब्लॉक की तुलना में कम जीवनकाल होता है। भंडारण एक स्थानीय संदर्भ चर से संबोधित किया जाता है कि स्थानीय संदर्भ चर
दूसरे शब्दों में के जीवनकाल की स्वतंत्र रूप से पुन: दावा किया जाता है, अगर आप कहते हैं:
void M()
{
Foo foo = GetAFoo();
UnmanagedLibrary.DoSomethingToFoo(foo);
}
तो घबराना कहने के लिए अनुमति दी है " आप जानते हैं, मैं देखता हूं कि अप्रबंधित कॉल के बाद कभी भी कोई प्रबंधित कोड फिर से foo का उपयोग नहीं करता है; इसलिए मैं उस समय उस ऑब्जेक्ट के भंडारण को पुनः प्राप्त कर सकता हूं, उस समय। जिसका अर्थ यह है कि अप्रबंधित कॉल ऑब्जेक्ट पर काम कर सकती है जब अचानक इसे किसी अन्य धागे पर हटा दिया जाता है।
फू के विनाशक होने पर यह विशेष रूप से बुरा है। अंतिमकरण कोड संभावित रूप से किसी अन्य धागे पर चलाया जाएगा जबकि ऑब्जेक्ट अप्रबंधित लाइब्रेरी द्वारा उपयोग में है, और स्वर्ग केवल जानता है कि किस प्रकार की आपदा होगी।
इस परिस्थिति में आपको प्रबंधित ऑब्जेक्ट को जीवित रखने के लिए KeepAlive का उपयोग करने की आवश्यकता है। स्थानीय चर पर भरोसा न करें; स्थानीय चर विशेष रूप से के रूप में दस्तावेजों को जीवित रखने की गारंटी के रूप में दस्तावेज किए जाते हैं।अधिक जानकारी के लिए
http://msdn.microsoft.com/en-us/library/system.gc.keepalive.aspx देखें।
स्रोत
2011-03-28 21:37:46
यदि अज्ञात विधि एक स्थानीय चर है तो इसे "जीवित" माना जाता है जब तक CopyFileEx वापस नहीं आया है? – SpeksETC
काफी यकीन है कि यह – sehe
@sehe, @SpeksETC: काफी यकीन है, क्या आप हैं? विनिर्देश में ठीक कहां कहता है? Spec की मेरी प्रति विपरीत कहती है, "* कंपाइलर कोड उत्पन्न कर सकता है जिसके परिणामस्वरूप वेरिएबल के भंडारण में इसके युक्त ब्लॉक * से कम जीवनकाल होता है।" –