सी # में, IEnumerator इंटरफ़ेस एक संग्रह पार और तत्वों को देखने के लिए एक तरह से परिभाषित करता है। मुझे लगता है कि यह बहुत उपयोगी है क्योंकि यदि आप किसी विधि में IEnumerable<T>
पास करते हैं, तो यह मूल स्रोत को संशोधित नहीं करेगा।इटरेटर हटाने() ऑपरेशन को परिभाषित क्यों करता है?
हालांकि, जावा में, Iteratorremove ऑपरेशन को परिभाषित करता है (वैकल्पिक रूप से!) तत्वों को हटाने की अनुमति देता है। Iterable<T>
को किसी विधि में पास करने में कोई फायदा नहीं है क्योंकि वह विधि मूल संग्रह को अभी भी संशोधित कर सकती है।
remove
के optionalnessrefused bequest गंध का एक उदाहरण है, लेकिन अनदेखी कि (पहले से ही here चर्चा की) मैं डिजाइन फैसले कि एक remove
घटना के लिए प्रेरित किया इंटरफेस पर लागू किया जाना में रुचि होगी।
क्या डिजाइन फैसले कि remove
करने के लिए नेतृत्व Iterator
को जोड़ा जा रहा है?
एक और तरीका रखने के लिए, सी # डिज़ाइन निर्णय क्या है जो स्पष्ट रूप से remove
पर IEnumerator
पर परिभाषित नहीं है?
'unmodifiableXYZ' हालांकि एक रनटाइम चीज़ है, मुझे स्थिर इनविएंट पसंद हैं। मुझे डिज़ाइन के फैसले में अधिक दिलचस्पी थी जिसके कारण 'हटाया जा रहा' और शायद सी # ने भी क्यों नहीं चुना। –
'unmodifiableXYZ' का उपयोग करने के लिए बुरी चीज यह है कि अगर किसी ने पहले से ही लिपटा हुआ 'XYZ' पारित किया है, तो आप इसे दो बार लपेट सकते हैं, और जब तक आप इसे काम करने के लिए प्रतिबिंब का उपयोग नहीं करते हैं तब तक आपके पास इससे बचने का कोई तरीका नहीं है। हालांकि मुझे विश्वास है कि कार्यान्वयन इसे अनुकूलित करेगा, यह अभी भी मेरे लिए बहुत बुरा लग रहा है। –
ओपनजेडीके कार्यान्वयन को देखते हुए, यह किसी भी एकाधिक रैपिंग से बचने के लिए प्रतीत नहीं होता है। इसका मतलब है कि एक जटिल अनुप्रयोग में आप आखिरकार 100 बार या उससे अधिक के लिए एक सरल 'ऐरेलिस्ट' लपेट सकते हैं। –