2008-10-22 16 views
48

मैं बस कुछ त्वरित कोड लिख रहा था में एक यात्रा चर का उपयोग और एक लैम्ब्डा अभिव्यक्ति में यात्रा चर का उपयोग करना अप्रत्याशित परिणाम दे सकते इस संकलक त्रुटिक्यों यह बुरा एक लैम्ब्डा अभिव्यक्ति

देखा जा सकता है।
इसके बजाय, लूप के भीतर एक स्थानीय चर बनाएँ और इसे पुनरावृत्ति चर के मान असाइन करें।

मुझे पता है इसका क्या अर्थ है और मैं इसे आसानी से ठीक कर सकता हूं, एक बड़ा सौदा नहीं।
लेकिन मैं सोच रहा था कि लैम्बडा में पुनरावृत्ति चर का उपयोग करना क्यों बुरा विचार है?
मैं बाद में किस समस्या का कारण बन सकता हूं?

+0

संबंधित: http://stackoverflow.com/questions/190227/building-a-linq-query-programatically-without-local-variables-tricking-me – nawfal

+0

बेहतर अगर आप एक उदाहरण देते हैं जहां यह वास्तव में काम करता है/देता है सही परिणाम! उदाहरण के लिए यहां देखें http://pastebin.com/raw/FghmXkby यह सही नहीं है .. लगातार वही गलत परिणाम। – barlop

उत्तर

50

विपक्ष इस कोड को ider:

List<Action> actions = new List<Action>(); 

for (int i=0; i < 10; i++) 
{ 
    actions.Add(() => Console.WriteLine(i)); 
} 

foreach (Action action in actions) 
{ 
    action(); 
} 

आप इसे प्रिंट करने की क्या अपेक्षा करेंगे? स्पष्ट उत्तर 0 है ... 9 - लेकिन वास्तव में यह 10, दस बार प्रिंट करता है। ऐसा इसलिए है क्योंकि केवल एक चर है जो सभी प्रतिनिधियों द्वारा कब्जा कर लिया जाता है। यह इस प्रकार का व्यवहार है जो अप्रत्याशित है।

संपादित करें: मैंने अभी देखा है कि आप सी # के बजाय वीबी.NET के बारे में बात कर रहे हैं। मेरा मानना ​​है कि वीबी.नेट के पास और भी जटिल नियम हैं, जिस तरह से वेरिएबल अपने मूल्यों को पुनरावृत्तियों में बनाए रखते हैं। This post by Jared Parsons इसमें शामिल कठिनाइयों के बारे में कुछ जानकारी दी गई है - हालांकि यह 2007 से वापस आ गई है, इसलिए तब से वास्तविक व्यवहार बदल सकता है।

+6

दो शब्दों में: लम्बाडा को लूपिंग के दौरान जरूरी रूप से मूल्यांकन नहीं किया जाता है, और जब उन्हें पुनरावृत्ति चर कहा जाता है, तो दायरे से बाहर हो सकता है, आवंटित नहीं किया जा सकता है, या इसके अंतिम मूल्य (लूप सीमा से परे) भी हो सकता है। – BertuPG

+8

@ बर्टूपीजी: इनमें से कौन सा शब्द आप सोच रहे थे? ;) –

+0

@ जोह: ओह ... हाँ ... तो मुझे "वाक्यांश" के साथ "शब्द" को प्रतिस्थापित करने दें ^^ – BertuPG

6

मान लीजिए कि आपका मतलब सी # है।

यह संकलक लागू होने के तरीके के कारण है। एक पुनरावृत्ति चर का उपयोग एक संशोधित बंद करने तक पहुंचने में समस्या का कारण बन सकता है (ध्यान दें कि मैंने कहा है कि 'नहीं' कर सकता है 'समस्या होगी क्योंकि कभी-कभी यह विधि में और क्या है, और कभी-कभी आप वास्तव में नहीं होते हैं संशोधित बंद करना चाहते हैं)।

और जानकारी:

http://blogs.msdn.com/abhinaba/archive/2005/10/18/482180.aspx

इससे भी अधिक जानकारी:

http://blogs.msdn.com/oldnewthing/archive/2006/08/02/686456.aspx

http://blogs.msdn.com/oldnewthing/archive/2006/08/03/687529.aspx

http://blogs.msdn.com/oldnewthing/archive/2006/08/04/688527.aspx

+1

यह "प्रति विधि एक बंद नहीं है" - यह उससे अधिक जटिल है। –

+0

हाँ मुझे एहसास है कि बुरी तरह पढ़ा गया - मैं स्थिति को जल्दी से पारदर्शी करने की कोशिश कर रहा था (रेमंड अधिक गहराई में बताते हैं)। अपमानजनक वाक्यांश को हटा दिया गया ताकि लोग अधिक जानकारी लिंक देख सकें। –

संबंधित मुद्दे