c# - सूची <टी> या IList <टी>



9 Answers

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

वास्तुकला अंतरिक्ष यात्री । संभावना है कि आप कभी भी अपना खुद का आईएलआईस्ट लिखेंगे जो पहले से ही .NET ढांचे में से कुछ को जोड़ता है, यह इतनी दूरदराज है कि सैद्धांतिक जेली टट्टियां "सर्वोत्तम प्रथाओं" के लिए आरक्षित हैं।

जाहिर है अगर आपसे पूछा जा रहा है कि आप एक साक्षात्कार में किस चीज का उपयोग करते हैं, तो आप कहते हैं कि इस्लामी, मुस्कान, और दोनों इतनी चतुर होने के लिए खुद को प्रसन्न करते हैं। या एक सार्वजनिक सामना एपीआई, IList के लिए। उम्मीद है कि आप मेरा मुद्दा प्राप्त करेंगे।

c# list generics

क्या कोई मुझे बता सकता है कि मैं सूची में आईएलआईस्ट पर सूची का उपयोग क्यों करना चाहूंगा?

संबंधित प्रश्न: List<T> का पर्दाफाश करना क्यों बुरा माना जाता है




List<T> IList<T> List<T> का एक विशिष्ट कार्यान्वयन है, जो एक कंटेनर है जिसे एक पूर्णांक अनुक्रमणिका का उपयोग कर रैखिक सरणी T[] के समान तरीके से संबोधित किया जा सकता है। जब आप विधि के तर्क के प्रकार के रूप में IList<T> निर्दिष्ट करते हैं, तो आप केवल निर्दिष्ट करते हैं कि आपको कंटेनर की कुछ क्षमताओं की आवश्यकता है।

उदाहरण के लिए, इंटरफ़ेस विनिर्देशन का उपयोग करने के लिए एक विशिष्ट डेटा संरचना को लागू नहीं करता है। List<T> का कार्यान्वयन एक रैखिक सरणी के रूप में तत्वों को एक्सेस करने, हटाने और जोड़ने के लिए समान प्रदर्शन के साथ होता है। हालांकि, आप एक कार्यान्वयन की कल्पना कर सकते हैं जो इसके बजाय एक लिंक्ड सूची द्वारा समर्थित है, जिसके लिए अंत में तत्व जोड़ना सस्ता है (निरंतर समय) लेकिन यादृच्छिक-पहुंच अधिक महंगा है। (ध्यान दें कि .NET LinkedList<T> IList<T> लागू नहीं करता है।)

यह उदाहरण आपको यह भी बताता है कि ऐसी स्थितियां हो सकती हैं जब आपको तर्क सूची में इंटरफ़ेस नहीं, कार्यान्वयन निर्दिष्ट करने की आवश्यकता होती है: इस उदाहरण में, जब भी आपको किसी विशेष पहुंच प्रदर्शन विशेषता की आवश्यकता होती है। यह आमतौर पर एक कंटेनर के विशिष्ट कार्यान्वयन के लिए गारंटी दी जाती है ( List<T> दस्तावेज़ीकरण: "यह एक सरणी का उपयोग करके IList<T> जेनेरिक इंटरफ़ेस लागू करता है जिसका आकार आवश्यकतानुसार गतिशील रूप से बढ़ता है।")।

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




मैं कंक्रीट कार्यान्वयन पर इंटरफ़ेस का उपयोग क्यों करना चाहिए, यह साबित करने के बजाय, आप इंटरफ़ेस के बजाय ठोस कार्यान्वयन का उपयोग क्यों करेंगे, यह पुष्टि करने के बजाय, मैं थोड़ा सा प्रश्न बदलूंगा। यदि आप इसे उचित नहीं ठहरा सकते हैं, तो इंटरफ़ेस का उपयोग करें।




टीडीडी और ओओपी का एक सिद्धांत आमतौर पर एक इंटरफेस के लिए प्रोग्रामिंग है जो कार्यान्वयन नहीं करता है।

इस विशिष्ट मामले में जब आप अनिवार्य रूप से किसी भाषा निर्माण के बारे में बात कर रहे हैं, तो कस्टम नहीं, यह आम तौर पर कोई फर्क नहीं पड़ता है, लेकिन उदाहरण के लिए कहें कि आपने पाया कि सूची आपको आवश्यक कुछ का समर्थन नहीं करती है। यदि आपने बाकी ऐप में IList का उपयोग किया था तो आप अपनी खुद की कस्टम क्लास के साथ सूची का विस्तार कर सकते हैं और फिर भी इसे बिना किसी रिफैक्टरिंग के पास पास कर पाएंगे।

ऐसा करने की लागत कम है, क्यों बाद में सिरदर्द को बचाओ? इंटरफ़ेस सिद्धांत यह सब कुछ है।




कार्यान्वयन पर इंटरफेस का उपयोग करने के लिए सबसे महत्वपूर्ण मामला आपके एपीआई के पैरामीटर में है। यदि आपका एपीआई एक सूची पैरामीटर लेता है, तो इसका उपयोग करने वाले किसी भी व्यक्ति को सूची का उपयोग करना होगा। यदि पैरामीटर प्रकार IList है, तो कॉलर की अधिक स्वतंत्रता है, और उन कक्षाओं का उपयोग कर सकते हैं जिनके बारे में आपने कभी नहीं सुना है, जो आपके कोड को लिखे जाने पर भी मौजूद नहीं हो सकता है।




क्या होगा यदि .NET 5.0 System.Collections.Generic.List<T> को प्रतिस्थापित करता है। .NET हमेशा नाम List<T> का मालिक है लेकिन वे गारंटी देते हैं कि IList<T> एक अनुबंध है। तो आईएमएचओ हम (कम से कम मैं) किसी के नाम का उपयोग नहीं करना चाहते हैं (हालांकि यह इस मामले में .NET है) और बाद में परेशानी में पड़ता है।

IList<T> का उपयोग करने के मामले में, कॉलर हमेशा काम करने के लिए अनुमानित चीजें हैं, और कार्यान्वयनकर्ता अंतर्निहित संग्रह को IList किसी भी वैकल्पिक ठोस कार्यान्वयन में बदलने के लिए स्वतंत्र है




आप ऐसा करेंगे क्योंकि एक आईएलआईस्ट या आईसीओलेक्शन को परिभाषित करना आपके इंटरफेस के अन्य कार्यान्वयन के लिए खुल जाएगा।

हो सकता है कि आप एक IOrderRepository लेना चाहें जो ऑलिस्ट या आईसीओलेक्शन में ऑर्डर के संग्रह को परिभाषित करता हो। तब तक आप आदेशों की एक सूची प्रदान करने के लिए विभिन्न प्रकार के कार्यान्वयन कर सकते हैं जब तक कि वे आपके IList या ICollection द्वारा परिभाषित "नियम" के अनुरूप हों।




IList <> अन्य पोस्टर की सलाह के मुताबिक लगभग हमेशा बेहतर होता है, हालांकि ध्यान दें कि डब्लूसीएफ डाटाकंट्रैक्टसेरियलाइज़र के साथ धारावाहिक / deserialization के एक से अधिक चक्र के माध्यम से एक आईएलआईटी <> चलाते समय .NET 3.5 SP 1 में एक बग है

इस बग को ठीक करने के लिए अब एक एसपी है: केबी 971030




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

क्लास नाम सूची अगले .NET ढांचे में बदला जा सकता है लेकिन अंतरफलक कभी भी परिवर्तित नहीं होगा क्योंकि इंटरफ़ेस अनुबंध है।

ध्यान दें कि, यदि आपका एपीआई केवल फोरैच लूप, आदि में उपयोग किया जा रहा है, तो आप इसके बजाय केवल आईनेमरेबल को उजागर करने पर विचार करना चाहेंगे।




Related