2013-04-28 11 views
39

यह ठीक काम करता है (के रूप में उम्मीद का मतलब है) में सी # 5.0:कब्जा कर लिया क्लोजर (लूप चर) सी # 5.0 में

var actions = new List<Action>(); 
foreach (var i in Enumerable.Range(0, 10)) 
{ 
    actions.Add(() => Console.WriteLine(i)); 
} 
foreach (var act in actions) act(); 

प्रिंटों 9. 0 लेकिन यह एक 10 10 के लिए बार दिखाता है:

var actions = new List<Action>(); 
for (var i = 0; i < 10; i++) 
{ 
    actions.Add(() => Console.WriteLine(i)); 
} 
foreach (var act in actions) act(); 

प्रश्न: यह एक समस्या थी जिसे हमने 5.0 से पहले सी # संस्करणों में किया था; तो हमें बंद करने के लिए एक लूप-स्थानीय प्लेसहोल्डर का उपयोग करना पड़ा और यह अब तय है - सी # 5.0 में - "foreach" loops में। लेकिन "के लिए" loops में नहीं!

इसके पीछे तर्क क्या है (for लूप भी समस्या को ठीक नहीं कर रहा है)?

+2

क्या आपका मतलब है "इसके लिए क्या कारण है कि 'लूप' के लिए भी तय नहीं किया जा रहा है? –

+0

मुझे आश्चर्य है कि यह पहले मामले में भी काम करता है ... चूंकि आप फोरच/के दायरे से बाहर निकलने के बाद कार्रवाई चलाते हैं। 'Var i' अब मौजूद नहीं होना चाहिए। मेरे लिए, यह एक बहुत ही "खतरनाक" डिजाइन है। – LightStriker

+0

@ लाइटस्ट्राइकर: नहीं; यह एक विशेषता है। इसे बंद करना कहा जाता है। – SLaks

उत्तर

37

इसके पीछे तर्क क्या है?

मैं आपको यह मानने जा रहा हूं कि "for लूप के लिए यह क्यों नहीं बदला गया था?"

उत्तर यह है कि for लूप के लिए, मौजूदा व्यवहार सही समझ में आता है। आप में एक for पाश तोड़ने हैं:

  • प्रारंभकर्ता
  • हालत
  • इटरेटर
  • शरीर

... तो पाश मोटे तौर पर है:

{ 
    initializer; 
    while (condition) 
    { 
     body; 
     iterator; 
    } 
} 

(सिवाय इसके कि iterator निष्पादित किया गया है टी एक continue; बयान के अंत के साथ ही, बिल्कुल।)

प्रारंभ हिस्सा तार्किक केवल एक बार होता है, तो यह पूरी तरह से तार्किक केवल एक "चर इन्स्टेन्शियशन" यह है कि है। इसके अलावा, लूप के प्रत्येक पुनरावृत्ति पर परिवर्तनीय का कोई प्राकृतिक "प्रारंभिक" मान नहीं है - यह कहने के लिए कुछ भी नहीं है कि for लूप में प्रारंभिक में एक चर घोषित करने वाले फॉर्म के रूप में है, इसे स्थिति में परीक्षण करना और इसे संशोधित करना इटरेटर में। आप क्या उम्मीद करेंगे करने के लिए इस तरह एक पाश:

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

तुलना करें कि एक foreach पाश जो लगता है कि आप हर यात्रा के लिए एक अलग चर घोषणा कर रहे की तरह साथ। हेक, चर केवल पढ़ने के लिए है, इसे और बनाने के लिए अजीब लगता है कि यह एक चर है जो पुनरावृत्तियों के बीच बदलता है। foreach लूप के बारे में सोचने के लिए यह सही समझ में आता है क्योंकि प्रत्येक पुनरावृत्ति पर एक नया रीड-ओनली वैरिएबल घोषित करने के साथ ही इसे पुनरावर्तक से लिया जाता है।

+5

(मेरे लिए उच्च रैंक डेवलपर के साथ बहस करना मुश्किल है अपनी तस्वीर के बगल में 55 9 के साथ; अभी तक :) सामान्य ज्ञान (मेरे दिमाग की सीमाओं तक सीमित हिस्सा) असहमत हो जाता है और कई अन्य भाषाओं में आप देख सकते हैं कि दोनों के लिए कार्य और foreach के रूप में कार्य करता है। चलो इस तरह के लूप को इस तरह लिखते हैं: var x = startizer(); जबकि (हालत) {feed_x_to_body (शरीर); एक्स = इटरेटर(); } और मैं उम्मीद करता हूं कि feed_x_to_body (जो कंपाइलर के लिए नौकरी है) क्या यह अपेक्षित नौकरी है (जैसा कि अंतर्निहित कार्यान्वयन के अनुसार तार्किक नहीं है - यह संकलक के हित में नहीं है!)। शायद मैं गलत हूँ; कृपया अधिक मार्गदर्शन करें। –

+0

@ केवेशहाबाज़ियन: नहीं, ऐसा नहीं है कि 'फॉर' लूप कैसे काम करता है। तथ्य यह है कि प्रारंभिक में बिल्कुल एक चर घोषित करने के लिए कई 'लूप * होते हैं * अप्रासंगिक है। प्रारंभकर्ता में घोषित वैरिएबल * वैरिएबल है जो लूप के शरीर में प्रयोग किया जाता है - ऐसा नहीं है कि शरीर को एक चर * मान * दिया जाता है। विशेष रूप से, लूप का शरीर वैरिएबल * को भी संशोधित कर सकता है, जो दुनिया के आपके मॉडल को तोड़ देगा। –

+0

"वेरिएबल को संशोधित करने में सक्षम होने के कारण" यह मुझे स्पष्ट करता है।फिर भी मुझे लगता है कि जब मैं एक नया गुंजाइश बना देता हूं (एक लैम्ब्डा बॉडी की तरह) चर के मूल्य को इसके मुख्य दायरे से अलग किया जाना चाहिए। उस हिस्से को अभी भी मेरे दिमाग में यह जगह नहीं मिली है और यह उस हिस्से के बारे में अधिक मार्गदर्शन करने के लिए आप बहुत दयालु होगा। लेकिन मैं आपकी प्रतिक्रिया को जवाब के रूप में चिह्नित करता हूं क्योंकि यह (वर्तमान) सी # दुनिया फिट बैठता है। धन्यवाद; –

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