2010-10-23 13 views
13

में केवल पढ़ने के लिए फोरैच लूप क्यों पढ़ा जाता है? मेरा मतलब है कि आप डेटा ला सकते हैं लेकिन ++ या कमी नहीं बढ़ा सकते हैं। इसके पीछे कोई कारण? हाँ मैं हूँ अभी शुरुआत :)क्यों फोरैच लूप सी #

उदाहरण के:

int[] myArray={1,2,3}; 
foreach (int num in myArray) 
{ 
    num+=1; 
} 
+1

क्या आप केवल पढ़ने के लिए जा रहा है, जबकि पाश से मतलब है? जबकि लूप एक निर्माण है; यह न तो केवल पढ़ने के लिए और न ही पढ़ना है। क्या आप शायद कुछ कोड पोस्ट कर सकते हैं और/या अपने प्रश्न को स्पष्ट कर सकते हैं, कृपया? धन्यवाद। – CesarGon

+1

मुझे लगता है कि वह पुनरावृत्ति चर के बारे में बात कर रहा है, जैसा कि foreach (आइटम IItem inItemList) ... Item को असाइन नहीं किया जा सकता है। –

+0

उन्होंने अब सवाल स्पष्ट किया है: वह थोड़ी देर के बजाय foreach के बारे में बात कर रहा है। – CesarGon

उत्तर

9

है ऐसा इसलिए है क्योंकि foreach यकीन है कि प्रत्येक आइटम कंटेनर बदले बिना ठीक एक बार दौरा किया है, जिससे एक कंटेनर से अधिक पुनरावृति करने के लिए है, बुरा से बचने के लिए दुष्प्रभाव।

देखें: foreach in MSDN

यदि आप मतलब क्यों एक पूर्णांक की तरह एक तत्व में परिवर्तन पूर्णांकों का एक कंटेनर को प्रभावित नहीं करेगा, अच्छी तरह से इस वजह से इस मामले में यात्रा के चर एक मान प्रकार हो सकता है और नकल की जाती है उदाहरण के लिए:

// Warning: Does not compile 
foreach (int i in ints) 
{ 
    ++i; // Would not change the int in ints 
} 

यहां तक ​​कि अगर यात्रा की चर एक संदर्भ प्रकार, जिसका संचालन एक नई वस्तु लौट आए, आप मूल संग्रह में बदलाव नहीं किया जाएगा, तो आप सिर्फ इस चर समय की सबसे करने के लिए फिर नियत किया जाएगा:

// Warning: Does not compile 
foreach (MyClass ob in objs) 
{ 
    ob=ob+ob; // Reassigning to local ob, not changing the one from the original 
      // collection of objs 
} 

निम्न उदाहरण संभावित वास्तव में एक परिवर्तनशील विधि को फोन करके मूल संग्रह में वस्तु को संशोधित करने के होते हैं:

// Warning: Does not compile 
foreach (MyClass ob in objs) 
{ 
    ob.ChangeMe(); // This could modify the object in the original collection 
} 

बनाम संदर्भ प्रकार मूल्य के संबंध में भ्रम से बचने के और परिदृश्यों कि ऊपर उल्लेख किया (अनुकूलन से संबंधित कुछ कारणों के साथ), एमएस ने पुनरावृत्ति के चर को readonly बनाने का विकल्प चुना।

1

foreach एक ही संग्रह में प्रत्येक आइटम को एक बार देखने के लिए डिज़ाइन किया गया है, और एक स्पष्ट "लूप इंडेक्स" का उपयोग नहीं करता है; यदि आप लूप पर अधिक नियंत्रण चाहते हैं और एक लूप इंडेक्स है, तो for का उपयोग करें।

संपादित करें: आप संग्रह में आइटम को foreach लूप के अंदर पुनरावृत्त किया जा सकता है। उदाहरण के लिए:

foreach(Chair ch in mychairs) 
{ 
    ch.PaintColour = Colour.Green; //this alters the chair object *in* the collection. 
} 

हालांकि, आप संग्रहण में आइटम को जोड़ या हटा नहीं सकते हैं।

+0

दरअसल, आप पुनरावृत्ति के चर द्वारा प्रस्तुत ऑब्जेक्ट के किसी फ़ील्ड/प्रॉपर्टी को संशोधित नहीं कर सकते हैं। –

+0

@ माइकल: मेरे द्वारा पोस्ट किया गया कोड मेरे लिए ठीक काम करता है। मैं .NET 3.5 और विजुअल स्टूडियो 2008 का उपयोग कर रहा हूं। – CesarGon

7

क्योंकि वर्तमान तत्व मूल्य (यानी कॉपी किया गया) द्वारा वापस किया जाता है। और प्रतिलिपि को संशोधित करना बेकार है। यदि यह संदर्भ प्रकार है तो आप उस ऑब्जेक्ट की सामग्री को संशोधित कर सकते हैं, लेकिन संदर्भ को प्रतिस्थापित नहीं कर सकते हैं।

शायद आपको IEnumerable<T> और IEnumerator<T> के दस्तावेज़ों को पढ़ना चाहिए। इसे स्पष्ट करना चाहिए। सबसे महत्वपूर्ण बात यह है कि IEnumerable<T> में प्रकार T है। और इस संपत्ति में केवल एक गेटर है, लेकिन कोई सेटटर नहीं है।

लेकिन अगर यह एक सेटटर था तो क्या होगा?

  • यह सरणियों के साथ अच्छी तरह से काम करते हैं और सूचियाँ
  • यह hashtables की तरह जटिल कंटेनर के साथ अच्छी तरह से काम नहीं होगा, सूची का आदेश दिया क्योंकि परिवर्तन (एक पुनर्व्यवस्था उदाहरण के लिए) कंटेनर में बड़े परिवर्तन, और इस प्रकार अमान्य कर देता है का कारण बनता है इटेटरेटर (अधिकांश संग्रह इटरेटर्स को अमान्य करते हैं यदि वे इटरेटर्स में असंगत स्थिति से बचने के लिए संशोधित होते हैं।)
  • LINQ में यह बिल्कुल समझ में नहीं आता है। उदाहरण के लिए select(x=>f(x)) के साथ मान एक फ़ंक्शन के परिणाम हैं और आपके पास कोई स्थायी संग्रहण संबद्ध नहीं है।
  • iterators साथ yield return वाक्य रचना यह नहीं है के साथ लिखा भावना या तो
+0

"और कॉपी को संशोधित करना बेकार है।" क्या होगा यदि मैं सूची में सभी संख्याओं के वर्ग की तरह कुछ करना चाहता हूं? इसे केवल पढ़ने के प्रतिबंध के साथ किया जा सकता है, लेकिन अक्सर एक प्रति को संशोधित करने में उपयोगी होता है। – raylu

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