c# - why the second writeline print out 12 when using lambda? -


नीचे कोड

  int factor = 2; ट्रांसफार्मर sqr = x = & gt; एक्स फैक्टर; Console.WriteLine (sqr (3)); // 6 कारक = 4; Console.WriteLine (sqr (3)); // 12  

मुझे लगता है कि संकलित समय में लैम्ब्डा को कारक पर कब्जा करना चाहिए, इसलिए इसका परिणाम दो रसीले के लिए होना चाहिए।

हालांकि, मुझे 6 और 12 मिलते हैं, तो सी # लैम्ब्डा गतिशील scoping का उपयोग करता है? मैंने सोचा था कि लैम्ब्डा को "लेक्सिकल गुंजाइश" नामक कुछ का उपयोग करना चाहिए

सबसे पहले आप संकलन समय पर कुछ भी हासिल नहीं कर सकते । लैम्ब्डा के लिए वातावरण केवल रनटाइम पर ही कब्जा कर लिया जा सकता है, क्योंकि यह केवल एक ही समय है जब यह मौजूद है।

जब एक लैम्बडा द्वारा एक चर को कब्जा कर लिया जाता है तो लैम्ब्डा को पूरी तरह से उस वेरिएबल पर सीधे पहुंच होती है अपने जीवनकाल का; बाहर से मूल्य में परिवर्तन लैम्ब्डा (Google "संशोधित समापन तक पहुंच") और रिवर्स भी सत्य है।

यह निम्नानुसार है कि यदि आप बाहरी हस्तक्षेप से लैम्ब्डा अलग करना चाहते हैं तो आपके पास इसे किसी चीज़ को कैप्चर करने के लिए जो "बाहर" से किसी को भी तक पहुंच नहीं है - इसका मतलब है कि एक चर का दायरा पर्याप्त रूप से सीमित है।

विचार करें:

< पूर्व> int factor = 2; Func & lt; int, Func & lt; int, int & gt; & gt; GenerationTransformer = f = & gt; X = & gt; एक्स * एफ; फ़ंक्शन & lt; int, int & gt; Sqr = जनरेटसंपादक (कारक); Console.WriteLine (sqr (3)); // 6 कारक = 4; Console.WriteLine (sqr (3)); // 6

यहाँ क्या होता है कि sqr कॉलिंग का परिणाम है generantransformer और यह स्थानीय चर के मूल्य पर कब्जा कर रहा है f के अंदर जनरेटसंपादक । यह मान किसी के द्वारा कभी भी बदला जा सकता है क्योंकि यह generTransformer के शरीर के बाहर किसी के द्वारा नहीं देखा जा सकता है जनरेटसंपादक कॉलिंग कारक के वर्तमान मूल्य की प्रतिलिपि बनाता है और इसे "स्थिर" कॉपी को sqr के उपयोग के लिए देता है।


Comments

Popular posts from this blog

python - Overriding the save method in Django ModelForm -

html - CSS autoheight, but fit content to height of div -

qt - How to prevent QAudioInput from automatically boosting the master volume to 100%? -