भी देखें इन संबंधित संसाधन:क्या एक अनुरूप सी # कंपाइलर एक स्थानीय (लेकिन अप्रयुक्त) चर को ऑप्टिमाइज़ कर सकता है यदि यह किसी ऑब्जेक्ट का एकमात्र मजबूत संदर्भ है?
- Does the .NET garbage collector perform predictive analysis of code? (ढेर पर ओवरफ्लो)
- WP7: When does GC Consider a Local Variable as Garbage (MSDN पर ब्लॉग लेख)
दूसरे शब्दों में:
एक वस्तु एक स्थानीय चर द्वारा संदर्भित से पहले चर क्षेत्र से बाहर (जैसे चला जाता है फिर से दावा किया जा सकता है। क्योंकि वेरिएबल असाइन किया गया है, लेकिन फिर फिर से उपयोग नहीं किया गया है), या ऑब्जेक्ट कचरा संग्रह के लिए अयोग्य होने की गारंटी है जब तक वेरिएबल गुंजाइश से बाहर नहीं जाता है?
मुझे स्पष्ट करने दें:
void Case_1()
{
var weakRef = new WeakReference(new object());
GC.Collect(); // <-- doesn't have to be an explicit call; just assume that
// garbage collection would occur at this point.
if (weakRef.IsAlive) ...
}
इस कोड उदाहरण में, मैं स्पष्ट रूप से संभावना है कि new'ed object
कचरा कलेक्टर द्वारा पुन: दावा है के लिए योजना बनाने के लिए है, इसलिए if
कथन।
(ध्यान दें कि मैं पता चल सके कि new'ed object
अभी भी चारों ओर है के एकमात्र उद्देश्य के weakRef
उपयोग कर रहा हूँ।)
void Case_2()
{
var unusedLocalVar = new object();
var weakRef = new WeakReference(unusedLocalVar);
GC.Collect(); // <-- doesn't have to be an explicit call; just assume that
// garbage collection would occur at this point.
Debug.Assert(weakRef.IsAlive);
}
पिछले एक से इस कोड उदाहरण में मुख्य परिवर्तन यह है कि नए object
को स्थानीय चर (unusedLocalVar
) द्वारा दृढ़ता से संदर्भित किया गया है। हालांकि, कमजोर संदर्भ (weakRef
) के बाद इस चर का उपयोग कभी भी नहीं किया जाता है।
प्रश्न: एक अनुरूप सी # संकलक Case_1
के उन लोगों में Case_2
के पहले दो लाइनों का अनुकूलन करने की अनुमति दी देखता है कि अगर unusedLocalVar
केवल अर्थात् WeakReference
निर्माता के लिए एक तर्क के रूप, एक ही स्थान पर प्रयोग किया जाता है? यानी क्या कोई संभावना है कि Case_2
में दावा कभी विफल हो सकता है?
यह भी ध्यान दें कि, डिबग बिल्ड में, चर को स्पष्ट रूप से डीबगर के लिए दायरे के अंत तक जीवित रखा जाता है - यह केवल रिलीज में ही बनाता है, आपको यह व्यवहार दिखाई देगा। –
@ एंडी - दिलचस्प बिंदु। यह महत्वपूर्ण नहीं है, लेकिन मुझे लगता है कि यह व्यवहार JITTER द्वारा शासित है? –
और पूर्णता के लिए, यही कारण है कि विधि के _end_ पर 'unusedLocalVar = null' सेटिंग आमतौर पर एक डी-ऑप्टिमाइज़ेशन होती है। –