मैं निम्न विधि है:क्यों सी # अज्ञात प्रतिनिधि कॉल के संदर्भ को संरक्षित नहीं करता है?
static Random rr = new Random();
static void DoAction(Action a)
{
ThreadPool.QueueUserWorkItem(par =>
{
Thread.Sleep(rr.Next(200));
a.Invoke();
});
}
अब मैं इस एक में पाश के लिए इस तरह कहते हैं:
for (int i = 0; i < 10; i++)
{
var x = i;
DoAction(() =>
{
Console.WriteLine(i); // scenario 1
//Console.WriteLine(x); // scenario 2
});
}
परिदृश्य 1 आउटपुट में
है: 10 10 10 10 ... 10
परिदृश्य 2 में उत्पादन होता है: 2 6 5 8 4 ... 0
(0 से 9 के यादृच्छिक क्रमपरिवर्तन)
आप इसे कैसे समझाते हैं? अज्ञात प्रतिनिधि कॉल के लिए क्या सी # को चर ("i
) संरक्षित नहीं करना चाहिए?
लेकिन संरक्षित ('कैप्चरिंग') * चर * * i' * बिल्कुल * क्या हो रहा है! क्या * नहीं हो रहा है, यद्यपि आप इसे चाहते हैं, * प्रतिनिधि की स्थापना के समय 'i' के ** मूल्य ** को संरक्षित कर रहा है *। – AakashM
संयोग से, रीशेर्पर आपको इस कोड के साथ प्रस्तुत किए जाने पर [संशोधित बंद करने के लिए एक्सेस] (http://confluence.jetbrains.net/display/ReSharper/Access+to+modified+closure) के बारे में चेतावनी देगा; आपको वहां स्पष्टीकरण मिल सकता है। – AakashM
http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-cononsidered-harmful.aspx –