चूंकि यहाँ किसी ने सीधे ECMA-334 का हवाला नहीं दिया था :
10.4.4.10 बयानों के लिए
फॉर्म के फॉर-स्टेटमेंट के लिए निश्चित असाइनमेंट की जाँच:
for (for-initializer; for-condition; for-iterator) embedded-statement
किया जाता है जैसे कि बयान लिखा गया था:
{
for-initializer;
while (for-condition) {
embedded-statement;
LLoop: for-iterator;
}
}
कल्पना में आगे,
12.16.6.3 स्थानीय चरों की तात्कालिकता
एक स्थानीय चर को तात्कालिक माना जाता है जब निष्पादन चर के दायरे में प्रवेश करता है।
[उदाहरण: उदाहरण के लिए, जब निम्न विधि को लागू किया जाता है, तो स्थानीय चर x
त्वरित और तीन बार शुरू होता है - एक बार लूप के प्रत्येक पुनरावृत्ति के लिए।
static void F() {
for (int i = 0; i < 3; i++) {
int x = i * 2 + 1;
...
}
}
हालाँकि, x
लूप के बाहर की घोषणा को आगे बढ़ाने से एक ही पल में परिणाम होता है x
:
static void F() {
int x;
for (int i = 0; i < 3; i++) {
x = i * 2 + 1;
...
}
}
अंत उदाहरण]
जब कब्जा नहीं किया जाता है, तो यह देखने का कोई तरीका नहीं है कि स्थानीय चर को कितनी बार त्वरित रूप से देखा जाता है - क्योंकि तात्कालिकता के जीवनकाल निराशाजनक हैं, प्रत्येक तात्कालिकता के लिए बस एक ही भंडारण स्थान का उपयोग करना संभव है। हालाँकि, जब कोई अनाम फ़ंक्शन किसी स्थानीय चर को कैप्चर करता है, तो तात्कालिकता के प्रभाव स्पष्ट हो जाते हैं।
[उदाहरण: उदाहरण
using System;
delegate void D();
class Test{
static D[] F() {
D[] result = new D[3];
for (int i = 0; i < 3; i++) {
int x = i * 2 + 1;
result[i] = () => { Console.WriteLine(x); };
}
return result;
}
static void Main() {
foreach (D d in F()) d();
}
}
उत्पादन का उत्पादन:
1
3
5
हालाँकि, जब घोषणा x
को लूप के बाहर ले जाया जाता है:
static D[] F() {
D[] result = new D[3];
int x;
for (int i = 0; i < 3; i++) {
x = i * 2 + 1;
result[i] = () => { Console.WriteLine(x); };
}
return result;
}
आउटपुट है:
5
5
5
ध्यान दें कि कंपाइलर को एक ही प्रतिनिधि उदाहरण ()11.7.2) में तीन तात्कालिकता का अनुकूलन करने की अनुमति है (लेकिन आवश्यक नहीं)।
यदि एक फॉर-लूप एक पुनरावृत्ति चर घोषित करता है, तो उस चर को लूप के बाहर घोषित किया जाता है। [उदाहरण: इस प्रकार, यदि उदाहरण को परिवर्तनशील चर पर कब्जा करने के लिए बदल दिया जाता है:
static D[] F() {
D[] result = new D[3];
for (int i = 0; i < 3; i++) {
result[i] = () => { Console.WriteLine(i); };
}
return result;
}
चलना चर का केवल एक उदाहरण कैप्चर किया गया है, जो आउटपुट उत्पन्न करता है:
3
3
3
अंत उदाहरण]
अरे हाँ, मुझे लगता है कि यह उल्लेख किया जाना चाहिए कि C ++ में यह समस्या इसलिए नहीं है क्योंकि आप चुन सकते हैं कि चर मान द्वारा या संदर्भ द्वारा कैप्चर किया गया है (देखें: लैम्ब्डा कैप्चर )।