निम्नलिखित कोड 012 के बजाय 33 आउटपुट करता है। मुझे समझ में नहीं आता कि एक नया चर लूपस्कोपेडी एक ही चर को कैप्चर करने के बजाय प्रत्येक पुनरावृत्ति में क्यों नहीं पकड़ा जाता है।सी # लैम्ब्डा अभिव्यक्तियों के अंदर परिवर्तनीय घोषित
Action[] actions = new Action[3];
for (int i = 0; i < 3; i++)
{
actions [i] =() => {int loopScopedi = i; Console.Write (loopScopedi);};
}
foreach (Action a in actions) a(); // 333
होपवेवर, यह कोड 012 उत्पन्न करता है। दोनों के बीच क्या अंतर है?
Action[] actions = new Action[3];
for (int i = 0; i < 3; i++)
{
int loopScopedi = i;
actions [i] =() => Console.Write (loopScopedi);
}
foreach (Action a in actions) a(); // 012
आह यह एक संशोधित बंद करने का मुद्दा है - देखें http://stackoverflow.com/questions/235455/access-to-modified-closure –
क्लोजर समस्या: http://www.codethinked.com/c-closures-explained उदाहरण के लिए। व्यवहार 0net= 4.5 –
में अलग है एरिक लिपर्ट http://blogs.msdn.com/b/ericlippert/archive/2009/11/16/closing-over-the-loop-variable-part से इन 2 प्रविष्टियों को पढ़ें -two.aspx और http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-Considered-harmful.aspx – Icarus