2016-12-21 9 views
7

मेरा प्रश्न IEnumerable<T> के उपयोग बनाम IReadOnlyCollection<T> के विषय में this one से संबंधित है।IReadOnlyCollection <T> बजाय IEnumerable <T> का उपयोग मानकों से बचने के लिए के लिए संभव कई गणन

मैंने हमेशा संग्रह प्रकारों और पैरामीटर दोनों के रूप में संग्रह का पर्दाफाश करने के लिए IEnumerable<T> का उपयोग किया है क्योंकि यह अपरिवर्तनीय और आलसी दोनों निष्पादित होने से लाभान्वित है।

हालांकि, मैं अपने कोड में स्थानों के प्रसार के बारे में चिंतित हो रहा हूं, जहां मुझे संभावित एकाधिक बहुमूल्य चेतावनी से बचने के लिए पैरामीटर का आकलन करना होगा जो रेसर्पर देता है। मैं समझता हूं कि रीशर्पर इसका सुझाव क्यों देता है, और मैं कोड के साथ सहमत हूं जो नीचे बताता है (नीचे) encapsulation सुनिश्चित करने के लिए (यानी, कॉलर के बारे में कोई धारणा नहीं)।

Foo[] arr = col as Foo[] ?? col.ToArray(); 

हालांकि, मैं इस कोड pollutive के repetitiveness मिल जाए, और मैं कुछ सूत्रों का कहना है कि IReadOnlyCollection<T> एक बेहतर विकल्प, विशेष रूप से अंक this article में की गई, जिसमें कहा गया है के साथ सहमत:

हाल ही में, मैं IEnumerable<T> लौटने की योग्यता और दोषों पर विचार कर रहा है।

प्लस तरफ, इसके बारे में के रूप में कम से कम के रूप में एक अंतरफलक हो जाता है, इसलिए यह IList<T> या (heaven forbid) एक सरणी की तरह एक भारी वैकल्पिक करने से तुलना में अधिक लचीलापन विधि लेखक के रूप में आप छोड़ देता है।

लेकिन, जैसा कि मैं the last post में उल्लिखित है, एक IEnumerable<T> वापसी कॉल Liskov Substitution Principle उल्लंघन करने के लिए entices। यह उनके लिए LINQ एक्सटेंशन विधियों जैसे Last() और Count(), का उपयोग करने के लिए आसान है जिसका अर्थ IEnumerable<T> वादा नहीं करता है।

ऐसे प्रलोभनों को इतनी प्रख्यात किए बिना लौटाए गए संग्रह को लॉक करने का एक बेहतर तरीका क्या है। (मुझे बार्नी की याद दिलाई गई है कि इस पाठ को कठिन तरीके से सीखना।)

IReadOnlyCollection<T> दर्ज करें, .NET 4.5 में नया। यह केवल संपत्ति IEnumerable<T> में जोड़ता है: Count संपत्ति। गिनती का वादा करके, आप अपने कॉलर्स को आश्वस्त करते हैं कि आपके IEnumerable<T> में वास्तव में टर्मिनस है। वे Last() जैसे स्पष्ट विवेक के साथ LINQ एक्सटेंशन विधियों का उपयोग कर सकते हैं।

हालांकि, जैसा कि पर्यवेक्षक ने देखा होगा, यह आलेख केवल वापसी प्रकारों के लिए IReadOnlyCollection<T> का उपयोग करने के बारे में बात करता है। मेरा सवाल यह है कि, वही तर्क भी पैरामीटर के लिए इसका उपयोग करने के लिए समान रूप से लागू होंगे? इस पर किसी सैद्धांतिक विचार या टिप्पणियों की भी सराहना की जाएगी।

वास्तव में, मैं IReadOnlyCollection<T> का उपयोग करने के लिए अंगूठे का एक सामान्य नियम सोच रहा हूं, जहां IEnumerable<T> का उपयोग किया जाता है, जहां कई समीकरण संभव होगा (रीशेपर चेतावनी के साथ)। अन्यथा, IEnumerable<T> का उपयोग करें।

+0

'[नोएन्यूमरेशन]' नामक रिशेर्पर की एनोटेशन में एक विशेषता है, लेकिन यह सिर्फ एक विशेषता है, लेकिन यह कहता है कि 'संकेत मिलता है कि माइक्रोनिएबल, पैरामीटर के रूप में पारित किया गया है, गणना नहीं की गई है।' यह कुछ भी नहीं है लेकिन मैंने इसका इस्तेमाल किया क्योंकि इसका ठंडा –

+0

@ एमकेज़ेमखरी, यह अच्छा है, और उपयोगी मुझे लगता है कि आप 'आईनेमेरेबल' की गणना नहीं कर रहे हैं। लेकिन मेरा प्रश्न उस उपयोग के मामले से व्यापक है, और 'आईन्यूमेरेबल' * के बारे में अधिक जानकारी है। क्या मैंने उल्लेख किए गए कारणों के लिए 'IReadOnlyCollection 'इन मामलों में एक बेहतर विकल्प है (यानी, लेख में किए गए अंक)? – Neo

उत्तर

1

इस बारे में सोचना, मैं अपने प्रश्न में वर्णित आलेख के आधार पर निष्कर्ष पर आया हूं, कि पैरामीटर के रूप में IReadOnlyCollection<T> का उपयोग करना वास्तव में ठीक है, लेकिन केवल उन कार्यों में जहां यह निश्चित रूप से गणना की जाएगी। यदि गणना अन्य पैरामीटर, ऑब्जेक्ट स्टेटस या वर्कफ़्लो के आधार पर सशर्त है, तो इसे अभी भी IEnumerable<T> के रूप में पारित किया जाना चाहिए ताकि आलसी मूल्यांकन को अर्थपूर्ण रूप से सुनिश्चित किया जा सके।

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