एरिक लिपर्ट का जवाब वास्तव में बिंदु को हिट करता है। हालांकि सामान्य रूप से स्टैक फ्रेम और कैप्चर करने की तस्वीर बनाने के लिए यह अच्छा लगेगा। ऐसा करने के लिए यह थोड़ा और जटिल उदाहरण देखने में मदद करता है। यहाँ
public class Scorekeeper {
int swish = 7;
public Action Counter(int start)
{
int count = 0;
Action counter =() => { count += start + swish; }
return counter;
}
}
और मैं क्या सोचते बराबर होगा (अगर हम भाग्यशाली हैं एरिक Lippert कि क्या यह वास्तव में सही है या नहीं पर टिप्पणी करेंगे) है:
यहाँ कैप्चरिंग कोड है
private class Locals
{
public Locals(Scorekeeper sk, int st)
{
this.scorekeeper = sk;
this.start = st;
}
private Scorekeeper scorekeeper;
private int start;
public int count;
public void Anonymous()
{
this.count += start + scorekeeper.swish;
}
}
public class Scorekeeper {
int swish = 7;
public Action Counter(int start)
{
Locals locals = new Locals(this, start);
locals.count = 0;
Action counter = new Action(locals.Anonymous);
return counter;
}
}
बिंदु यह है कि स्थानीय वर्ग पूरे स्टैक फ्रेम के लिए विकल्प देता है और प्रत्येक बार काउंटर विधि का आह्वान किया जाता है। आम तौर पर ढेर फ्रेम में 'इस', प्लस विधि तर्क, साथ ही स्थानीय चर के संदर्भ भी शामिल हैं। (जब नियंत्रण ब्लॉक दर्ज किया जाता है तो स्टैक फ्रेम भी प्रभावी रूप से विस्तारित होता है।)
नतीजतन हमारे पास कब्जे वाले संदर्भ से संबंधित केवल एक वस्तु नहीं है, इसके बजाय हमारे पास प्रति कब्जे वाले स्टैक फ्रेम में एक वस्तु है।
इस पर आधारित, हम निम्नलिखित मानसिक मॉडल का उपयोग कर सकते हैं: ढेर फ्रेम ढेर पर (ढेर के बजाय) पर रखा जाता है, जबकि ढेर में केवल ढेर पर मौजूद स्टैक फ्रेम में पॉइंटर्स होते हैं। लैम्ब्डा विधियों में ढेर के फ्रेम में एक सूचक होता है। यह प्रबंधित स्मृति का उपयोग करके किया जाता है, इसलिए फ्रेम ढेर पर चारों ओर चिपक जाता है जब तक इसकी आवश्यकता नहीं होती है।
स्पष्ट रूप से संकलक केवल ढेर का उपयोग करके इसे कार्यान्वित कर सकता है जब ढेर वस्तु को लैम्ब्डा बंद करने के लिए आवश्यक है।
मुझे इस मॉडल के बारे में क्या पसंद है यह 'उपज रिटर्न' के लिए एक एकीकृत तस्वीर प्रदान करता है। हम एक इटरेटर विधि (उपज रिटर्न का उपयोग करके) के बारे में सोच सकते हैं जैसे कि यह ढेर फ्रेम के ढेर के दौरान उपयोग के लिए, कॉलर में स्थानीय चर में संग्रहीत ढेर पर संदर्भित पॉइंटर बनाया गया था।
स्रोत
2017-10-25 04:26:13
शानदार सवाल। मुझे यकीन नहीं है, लेकिन हाँ, आप सी # में स्टैक फ्रेम को चारों ओर रख सकते हैं। जनरेटर इसे हर समय उपयोग करते हैं (डेटा संरचनाओं के लिए चीज LINQ) जो हुड के नीचे उपज पर भरोसा करते हैं। उम्मीद है कि मैं निशान से बाहर नहीं हूँ। अगर मैं हूं, तो मैं एक बड़ा सौदा सीखूंगा। –
उपज विधि को एक मशीन के साथ एक अलग वर्ग में बदल देती है। ढेर को चारों ओर नहीं रखा जाता है, लेकिन स्टैक स्थिति को कंपाइलर से उत्पन्न कक्षा – thecoop
@ थेकोप में कक्षा राज्य में स्थानांतरित किया जाता है, क्या आपके पास यह एक लिंक है? –