मैं समझता हूं कि अंकुशकों और उपज कीवर्ड का उपयोग एसिंक/स्टैगर्डेड ऑपरेशंस में सहायता के लिए किया जा सकता है, क्योंकि आप कोड के अगले ब्लॉक को चलाने के लिए MoveNext()
पर कॉल कर सकते हैं।जीसी आईन्यूमेरेटर और उपज के साथ कैसे काम करता है?
हालांकि, मैं वास्तव में समझ नहीं पा रहा हूं कि एन्यूमेरेटर ऑब्जेक्ट क्या है। गणक के दायरे के उपयोग में स्मृति कहां जाती है? यदि आप MoveNext()
एक गणक को हर तरह से नहीं करते हैं, तो क्या यह अंततः जीसीडी प्राप्त करता है?
असल में, मैं अपने जीसी हिट को नीचे रखने की कोशिश कर रहा हूं, क्योंकि मैं संभावित रूप से बहुत सारे एन्यूमेरेटर्स का उपयोग कर रहा हूं और जीसी एकता के अंदर एक मुद्दा हो सकता है, खासकर मोनो के पुराने संस्करण के कारण यह उपयोग करता है।
मैंने इसे प्रोफाइल करने का प्रयास किया है लेकिन अभी भी मेरे सिर को उनके चारों ओर लपेट नहीं सकता है। मैं गणनाकर्ताओं के साथ होने वाली स्कोपिंग/रेफरेंसिंग को समझ नहीं पा रहा हूं। मुझे यह भी समझ में नहीं आ रहा है कि अगर आप एक समारोह से एक बनाते हैं तो अंकुशक ऑब्जेक्ट्स के रूप में बनाए जाते हैं।
निम्न उदाहरण से पता चलता मेरी भ्रम बेहतर:
// Example enumerator
IEnumerator<bool> ExampleFunction()
{
SomeClass heavyObject = new SomeClass();
while(heavyObject.Process())
{
yield return true;
}
if(!heavyObject.Success)
{
yield return false;
}
// In this example, we'll never get here - what happens to the incomplete Enumerator
// When does heavyObject get GC'd?
heavyObject.DoSomeMoreStuff();
}
// example call - Where does this enumerator come from?
// Is something creating it with the new keyword in the background?
IEnumerator<bool> enumerator = ExampleFunction();
while(enumerator.MoveNext())
{
if(!enumerator.Current)
{
break;
}
}
// if enumerator is never used after this, does it get destroyed when the scope ends, or is it GC'd at a later date?
कंपाइलर आपके गणक विधि को फिर से लिखता है और कोड को एक कक्षा में एक अनपेक्षित नाम के साथ ले जाता है। यह वर्ग एक राज्य मशीन लागू करता है जहां आपके स्थानीय चर वर्ग के क्षेत्र बन जाते हैं, MoveNext() को राज्य खोने के बिना फिर से दर्ज करने की अनुमति देता है। IENumerator इंटरफ़ेस संदर्भ वास्तव में उस वर्ग के किसी ऑब्जेक्ट का संदर्भ है। जब भी उस संदर्भ को एकत्रित किया जाता है, तब सबकुछ अस्तित्व से बाहर हो जाता है, जैसे ही आपका कोड फ़ोरैच लूप छोड़ देता है, जीसी-एड होने के योग्य होता है। –
हंस ने जो कहा, उसका उदाहरण: http://goo.gl/fs4eNo – xanatos
ठीक है, धन्यवाद। यह वही नहीं करता जो मुझे उम्मीद थी। क्या इसका मतलब है कि पारंपरिक साधनों की तुलना में गणक काफी भारी हैं? मैं जीसी को नीचे रखने की कोशिश कर रहा हूं लेकिन ऐसा लगता है कि मैं कभी भी नया कचरा बनाने जा रहा हूं, जब भी मैं एक नया अंकुक्रम शुरू करता हूं (और मेरे पास बहुत सारे गणक हैं)। – mGuv