में एक लूप में कैप्चर वैरिएबल मैं सी # के बारे में एक दिलचस्प मुद्दा से मुलाकात की। मेरे पास कोड जैसा है।सी #
List<Func<int>> actions = new List<Func<int>>();
int variable = 0;
while (variable < 5)
{
actions.Add(() => variable * 2);
++ variable;
}
foreach (var act in actions)
{
Console.WriteLine(act.Invoke());
}
मैं उत्पादन 0, 2, 4, 6, 8 यह उम्मीद हालांकि, यह वास्तव में पांच 10s आउटपुट।
ऐसा लगता है कि यह सभी कार्यों के कारण एक कब्जे वाले चर का जिक्र है। नतीजतन, जब वे आते हैं, तो वे सभी एक ही आउटपुट होते हैं।
क्या प्रत्येक एक्शन इंस्टेंस के अपने कब्जे वाले चर के पास इस सीमा के चारों ओर काम करने का कोई तरीका है?
इस विषय पर एरिक लिपर्ट की ब्लॉग श्रृंखला भी देखें: [लूप वेरिएबल कंसिडेड हार्मफुल पर बंद होना] (http://blogs.msdn.com/b/ericlippert/archive/tags/closures/) – Brian
इसके अलावा, वे बदल रहे हैं सी # 5 काम करने के लिए जैसा कि आप एक foreach के भीतर उम्मीद करते हैं। (ब्रेकिंग चेंज) –
संबंधित: [क्यों-यह-खराब-उपयोग-एक-पुनरावृत्ति-चर-इन-ए-लैम्ब्डा-अभिव्यक्ति] (http://stackoverflow.com/questions/227820/why-is -it-bad-to-use-an-iteration-variable-in-a-lambda-expression) – nawfal