2017-05-10 12 views
9

मैं माइक्रोसॉफ्ट के Guidelines for Collections पर देख रहा हूँ और मैं मुश्किल में कुछ भागों को समझने के लिए लगता है के बारे में उलझन में:माइक्रोसॉफ्ट दिशानिर्देश: कई भागों

एक्स का उपयोग नहीं करते ArrayList या List<T> सार्वजनिक एपीआई में। क्या इसका मतलब यह है कि मुझे List<T> को पूरी तरह से लौटने से बचना चाहिए, या मैं इसे IEnumerable/IList के रूप में वापस कर सकता हूं, लेकिन स्पष्ट रूप से List<T> के रूप में नहीं?

✓ पैरामीटर प्रकार के रूप में कम से कम विशिष्ट प्रकार का उपयोग करें। पैरामीटर के रूप में संग्रह लेने वाले अधिकांश सदस्य IEnumerable<T> इंटरफ़ेस का उपयोग करते हैं। रीशेर्पर को "आईन्यूमेरेबल के संभावित बहुमूल्य गणना" के बारे में शिकायत करने के बाद, मैंने सोचा कि ICollection<T> लेना (और वापसी) एक बेहतर विचार था जब मैं वस्तुओं की पूर्व-गणना, सीमित संग्रह (यानी आलसी धारा नहीं) की अपेक्षा कर रहा था। क्या यह मामला नहीं है?

✓ DO संपत्तियों के लिए Collection<T> या Collection<T> का एक उपवर्ग का उपयोग करें या/लिखने संग्रह पढ़ का प्रतिनिधित्व मान। ICollection<T> का उपयोग क्यों नहीं करें? मैंने सोचा कि इंटरफेस कंक्रीट कक्षाओं के लिए बेहतर थे।

+0

ध्यान दें कि 2008 में लिखे गए उन दिशानिर्देशों और 3.5 के .NET और 3.0 के सी # के संस्करणों के लिए अद्यतन नहीं किए गए हैं। विशेष रूप से सलाह सी # 4.0 के साथ 2010 में कोविरेन्स और कंट्रावायरेंस की शुरूआत से पहले लिखी गई थी –

उत्तर

7

ये गाइडलाइन उन विधियों को बढ़ावा देने के लिए मौजूद हैं जो पैरामीटर के रूप में स्वीकार किए जाते हैं और वे लौटने वाले प्रकार के रूप में क्या लौटते हैं।

यदि आप किसी विधि से List<T> वापस करते हैं, तो यह विधि कभी भी List<T> पर कुछ भी वापस नहीं लौटा सकती है। यह कुछ परिदृश्यों में ठीक हो सकता है लेकिन दूसरों में ऐसा नहीं है। उदाहरण के लिए, एक ऐसी विधि पर विचार करें जो एक निश्चित अवधि के दौरान लॉग इन करने वाले उपयोगकर्ताओं का संग्रह देता है। यदि यह विधि केवल List<T> लौटाती है, तो उसे सभी उपयोगकर्ताओं को एक ही पास में प्राप्त करना और वापस करना होगा क्योंकि वे List के अर्थशास्त्र हैं: जैसे ही विधि वापस आती है, आपको कुल गणना के साथ सभी आइटम मिलते हैं। यह एक समस्या हो सकती है, यदि उपयोगकर्ताओं की संख्या हजारों हजारों है - सभी रिकॉर्ड प्राप्त करने में लंबा समय लग सकता है और वे बहुत सारी मेमोरी ले सकते हैं। फोन करने वाले वस्तुओं के संग्रह के माध्यम से पुनरावृति कर सकते हैं, लेकिन एक ही बार में सभी आइटम नहीं मिल -

इस विधि एक IEnumerable<T> वापसी होगी, तो उसके लिए गिनती या बार में सभी आइटम होने का कोई वादा है। यह कॉल करने की विधि को ऑब्जेक्ट (IEnumerable<T> लागू करने) को वापस करने की अनुमति देता है जो डेटा को छोटे बैचों में एकत्र करता है और अनुरोध के अनुसार उन्हें एक-एक करके देता है।

इसके अलावा, कई अलग अलग संग्रह प्रकार IEnumerable<T> लागू है, तो इस विधि का एक और कार्यान्वयन वास्तव में एक सूची उदाहरण, IEnumerable<T> लिए डाली वापस जाने के लिए तय कर सकते हैं। कॉलिंग विधि को पता या देखभाल नहीं होगी, क्योंकि यह अपेक्षा करता है कि यह IEnumerable<T> है। यह एक हार्डकोडेड सूची प्रकार के मामले में नहीं है - इसे किसी अन्य चीज़ के लिए आदान-प्रदान नहीं किया जा सकता है क्योंकि यह पहले से ही कंक्रीट जितना संभव हो सके।

सामान्य रूप से, एक सामान्य संग्रह इंटरफ़ेस किसी भी विधि के लिए सबसे लचीला इनपुट पैरामीटर/रिटर्न प्रकार होगा - एक इंटरफ़ेस आपको इसे कई तरीकों से कार्यान्वित करने, इसे मजाक करने, आदि के लिए अनुमति देगा ताकि आपके पास बहुत कुछ हो जो गुजरता है या लौटाता है उसे नियंत्रित करने में लचीलापन का। एक इंटरफ़ेस भी (आवश्यक रूप से) अर्थपूर्ण सीमाएं नहीं करता है जो उत्पाद के रूप में असुविधाजनक हो सकता है।

पहली सलाह के लिए, ArrayList एक भयानक प्रकार है जिसका उपयोग कभी भी .NET 2.0 के बाद नहीं किया जाना चाहिए, क्योंकि जेनेरिक प्रकार हर संभव तरीके से कहीं बेहतर होते हैं।

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