2009-05-28 9 views
6

FxCop का सुझाव और मेरी व्यक्तिगत झुकाव मैं टीम मैं जितना हो ReadOnlyCollections उपयोग करने के लिए कोचिंग कर रहा हूँ को प्रोत्साहित किया गया है के बाद शामिल नहीं है। यदि केवल इतना है कि सूचियों के प्राप्तकर्ता अपनी सामग्री को संशोधित नहीं कर सकते हैं। उनके सिद्धांत में यह रोटी & मक्खन है। समस्या यह है कि सूची <> इंटरफ़ेस उपयोगी विधियों के सभी प्रकारों को उजागर करने में बहुत समृद्ध है। उन्होंने यह चुनाव क्यों किया?क्यों ReadOnlyCollection <>) FindAll(), FindFirst (जैसे तरीकों,

क्या आप अभी लिखते हैं और लिखने योग्य संग्रह वापस करते हैं? क्या आप केवल पढ़ने के संग्रह को वापस करते हैं और फिर उन्हें लिखने योग्य विविधता में लपेटते हैं? Ahhhhh।


अद्यतन: धन्यवाद मैं फ्रेमवर्क डिजाइन दिशानिर्देश और thats क्यों टीम यह लागू करने के लिए FxCop उपयोग कर रहा है के साथ परिचित हूँ। हालांकि यह टीम वीएस 2005 (मुझे पता है, मुझे पता है) के साथ रह रही है और इसलिए उन्हें बता रही है कि LINQ/एक्सटेंशन विधियां उनकी समस्याओं का समाधान करती हैं, बस उन्हें दुखी बनाती है।

वे सीखा है कि List.FindAll() और .FindFirst() एक foreach पाश लिखने की तुलना में अधिक स्पष्टता प्रदान करते हैं। अब मैं उन्हें पढ़ने के लिए धक्का दे रहा हूं ReadOnlyCollections वे स्पष्टता खो देते हैं।

शायद एक गहरी डिजाइन समस्या है जिसे मैं खोज नहीं रहा हूं।

- क्षमा करें मूल पोस्ट में वीएस2005 प्रतिबंध का उल्लेख होना चाहिए था। मैं इतने लंबे समय तक रहा हूं कि मैं अभी ध्यान नहीं देता हूं।

उत्तर

6

धारा .NET Framework Design Guidelines Second Edition की 8.3.2:

उपयोग ReadOnlyCollection<T>, ReadOnlyCollection<T> का एक उपवर्ग DO, या गुणों के लिए दुर्लभ मामलों IEnumerable<T> में या केवल पढ़ने के लिए संग्रह का प्रतिनिधित्व मान।

हम वापस संग्रह के हमारे इरादे को व्यक्त करने के लिए ReadOnlyCollections के साथ जाते हैं।

List<T> आपके द्वारा बोलने वाले तरीकों को सुविधा के लिए .NET 2.0 में जोड़ा गया था। सी # 3.0/.NET 3.5 में, आप एक्सटेंशन विधियों का उपयोग करके उन सभी विधियों को ReadOnlyCollection<T> (या IEnumerable<T>) पर वापस प्राप्त कर सकते हैं (और LINQ ऑपरेटरों का भी उपयोग करें), इसलिए मुझे नहीं लगता कि उन्हें अन्य प्रकारों में मूल रूप से जोड़ने के लिए कोई प्रेरणा है । तथ्य यह है कि वे सूची में मौजूद हैं, विस्तार की विधियों की उपस्थिति के कारण अब एक ऐतिहासिक नोट है, लेकिन 2.0 में नहीं थे।

+2

अफसोस की बात है कि टीम 2.0 के समय में फंस गई है। –

3

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

+0

अफसोस की बात है कि टीम 2.0 के समय में फंस गई है। –

+0

@ मार्क, क्या आपको सी # 2.0 संगत कोड संकलित करने के लिए VS2008 का उपयोग करने की अनुमति है? यदि ऐसा है, तो आप इन एक्सटेंशन विधियों को स्वयं परिभाषित कर सकते हैं – JaredPar

+0

कोई समस्या यह नहीं है कि उनके पास अभी तक 2008 लाइसेंस नहीं हैं। स्पष्ट रूप से 2008 को स्थानांतरित करने की योजना कुछ समय के लिए किताबों पर रही है। नट्स #! @ & * # –

7

सबसे पहले, ReadOnlyCollection<T>IEnumerable<T> और IList<T> लागू करता है। .NET 3.5 और LINQ में सभी एक्सटेंशन विधियों के साथ, आपके पास क्वेरीिंग के मामले में मूल List<T> कक्षा से लगभग सभी कार्यक्षमता तक पहुंच है, जो आपको ReadOnlyCollection<T> के साथ किसी भी तरह से करना चाहिए।

कहा जा रहा है कि, आपका प्रारंभिक प्रश्न मुझे कुछ सुझाव देने के लिए प्रेरित करता है ...

लौटने List<T> खराब डिजाइन है, इसलिए यह तुलना की एक बिंदु नहीं होना चाहिए। कार्यान्वयन के लिए List<T> का उपयोग किया जाना चाहिए, लेकिन इंटरफेस के लिए, IList<T> वापस किया जाना चाहिए। Framework Design Guidelines विशेष रूप से राज्य:

"सार्वजनिक APIs में नहीं उपयोग ArrayList या List<T> करते हैं।" (पृष्ठ 251)

यदि आप इसे ध्यान में रखते हैं, ReadOnlyCollection<T> पर List<T> की तुलना में बिल्कुल कोई नुकसान नहीं है। इन दोनों वर्गों में IEnumerable<T> और IList<T> लागू होते हैं, जो इंटरफेस हैं जिन्हें किसी भी तरह से वापस किया जाना चाहिए।

+0

अफसोस की बात है कि टीम 2.0 के समय में फंस गई है। –

+0

@ मार्क लेविसन: यहां तक ​​कि 2.0 में, आपको IList वापस करना चाहिए, सूची नहीं, इसलिए टिप्पणियां अभी भी लागू होती हैं। –

0

मुझे लगता है कि जेफ के उत्तर में आपके पास आवश्यक उत्तर है; ReadOnlyCollection<T> की बजाय, इसके सबक्लास को वापस करें ... जिसे आप स्वयं को लागू करने के लिए स्वयं को लागू करते हैं, जिसे आप VS2008/LINQ में अपग्रेड किए बिना उपयोग करना चाहते हैं।

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