2011-02-24 11 views
15

संभव डुप्लिकेट:
C# - List<T> or IList<T>मुझे सूची <T> पर आईएलआईस्ट <T> क्यों वापस करनी चाहिए?

यह सब खत्म हो गया लिखा है, ताकि आप अपने तरीकों से IList<T> और नहीं List<T> लौटना चाहिए, लेकिन मैं किसी भी वास्तव में अच्छा कारण नहीं मिल रहा। मुझे लगता है कि यह करता है कोड ढूंढ पाएं, और फिर बुला कोड आमतौर पर दो परिणाम होते हैं में से एक:

  1. कॉल new List<T>(returnedIList) तो डाले सूची
  2. पर सभी अच्छा तरीकों का उपयोग कर सकते हैं वापस List<T> को तो यह सब का उपयोग कर सकते सूची पर अच्छा तरीकों

पहले एक भद्दा है और दूसरा एक (क्रम)InvalidCastException अगर कार्यान्वयन वास्तव में किसी और वैसे भी कुछ (जो बनाता है यह पूरी तरह से s में बदला फेंक tupid)।

यदि मैं List<T> का उपयोग करता हूं और किसी कारण से इसे IList<T> के कार्यान्वयन के साथ प्रतिस्थापित करना है, तो मुझे List<T> से प्राप्त नहीं हो सकता है, तो मुझे बिल्ड त्रुटियां मिलेंगी और कुछ कोड बदलना होगा। यह शायद बहुत ही असंभव है और यदि ऐसा होता है, तो यह ठीक करने के लिए बहुत काम नहीं है। निश्चित रूप से List<T> के लाभों को खोने और/या List<T> (मौजूद, ढूँढें, आदि) को इस संभावित परिदृश्य के लिए वापस लाने के लिए लायक नहीं है?

तो, क्या IList<T> लौटने के लिए अन्य कारण हैं?

+2

न केवल यह "एसओ पर लिखा गया है", यह सवाल पहले ही पूछा जा चुका है और उत्तर दिया गया है! –

+0

माफी - परिणाम के 3 पृष्ठों के बाद मैंने देखा - एसओ "प्रासंगिकता" हाल ही में मेरे लिए थोड़ा दूर लग रहा है! इस उत्तर के साथ जा रहे हैं: http://stackoverflow.com/questions/400135/c-listt-or-ilistt/1522826#1522826; डी –

+0

कोई माफी मांगनी नहीं है, एसओ पर सीमित सीमित उपयोगिता है। मैंने साइट पर Google पर खोज की: stackoverflow.com! डुप्ली खोजने के लिए! –

उत्तर

1

कारण यह है कि आपकी विधि का उपयोग IList<T> लागू करने वाले किसी भी चीज़ के साथ किया जा सकता है, न केवल एक सूची। यह और भी बदतर हो जाता है, हालांकि, लिंक के आगमन के बाद से, मैंने बहुत सारी चीजें Enumerable<T> या यहां तक ​​कि केवल IEnumerable लौटाने शुरू कर दी हैं!

मुझे यकीन नहीं है कि मैं कठिनाई को समझता हूं, हालांकि। अगर कोई वास्तविक सूची लौटा रहा है, और इसकी वापसी उस पर निर्भर करती है, या इसका उपयोग उस के लिए विशिष्ट है, तो इसे List<T> वापस करना चाहिए। यदि नहीं, तो आपको इसे किसी सूची में डालने की आवश्यकता नहीं होनी चाहिए।

+0

मुझे संदेह है कि विधि के बाद कॉलिंग कोड लिखा गया था, और प्रोग्रामर एक ठोस सूची वापस करने के लिए विधि को बदलने के लिए अनिच्छुक था - और मैं यह समझने की कोशिश कर रहा हूं कि यह निर्णय उचित है या नहीं। –

1

वास्तव में यदि संभव हो तो आपको IENumerable वापस लौटना चाहिए, अन्यथा IList।

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

आईलीस्ट से व्युत्पन्न प्रकारों के लिए खोजें और आप देखते हैं कि आपको .NET ढांचे के भीतर कई हिट मिलती हैं!

+0

आईन्यूमेरेबल इस कोड के बहुत से काम के लिए काम नहीं करता है (और मुझे इसे बदलना अच्छा लगेगा - एक के लिए, जब हम परिणामों के माध्यम से "स्ट्रीम" कर सकते हैं, तो मुझे स्मृति में सबकुछ लोड करने से नफरत है)। अगर हम एक कस्टम सूची को लागू करना चाहते हैं, तो मुझे लगता है कि हम पूरी चीज को रोल करने की तुलना में सूची से शुरू होने की अधिक संभावना रखते हैं? –

+0

IENumerable वास्तव में ऐसी चीजों को वापस करने का एक शानदार तरीका है जो सूची के रूप में उपयोग किए जा सकते हैं, क्योंकि नई सूची सीधे आईनेमेरेबल से बनाई जा सकती है (जैसे आपका पहला उदाहरण)। मैं निश्चित रूप से नहीं कह सकता लेकिन मुझे संदेह है कि ऐसा करने का उपर है यह, एक नई सूची ऑब्जेक्ट को सीधे लौटने की तुलना में शून्य है। कुछ जो IENumerable लौटाता है उसे 'उपज' के साथ कार्यान्वित किया जाना चाहिए, इसलिए वास्तव में कोई भी नई सूची वस्तु नहीं बना रहा है। इसलिए जब आप किसी सूची को तुरंत चालू करते हैं और इसमें तत्व जोड़ते हैं तो समान ई हो इशर रास्ता –

+0

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

10

यह मुझे लगता है जैसे आप कुछ खराब गुणवत्ता कोड देख रहे हैं।

List<T> के बजाय आपके कोड को अधिक लचीला होने की अनुमति देता है। आप किसी भी कॉलिंग कोड को तोड़ने के बिना IList<T> लागू करने वाले किसी भी संग्रह के साथ कार्यान्वयन को प्रतिस्थापित कर सकते हैं। यह एक अच्छी बात है ... लेकिन केवल तभी जब IList<T> में परिभाषित कार्यक्षमता आपकी आवश्यकताओं से मेल खाती है।

आप यह कहने के लिए सामान्यीकृत कर सकते हैं कि आपको हमेशा सबसे सामान्य प्रकार संभवतः वापस करना चाहिए। ज्यादातर मामलों में, आप IEnumerable<T> से दूर हो सकते हैं लेकिन यदि आपको अधिक कार्यक्षमता की आवश्यकता है, तो IList<T> काम करता है। यदि यह कट नहीं करता है, तो ठोस प्रकार वापस करें और इसके साथ किया जाए।

दोनों स्थितियों में आप उल्लेख करते हैं कि IList<T> (और यदि नहीं है, तो दोनों विधियों में त्रुटि नहीं है) का उपयोग करने की आवश्यकता है। उन मामलों में, या तो विधि को आवश्यक कार्यक्षमता प्रदान करने के लिए List<T> वापस करना चाहिए या कॉलर को किसी अन्य विधि का उपयोग करना चाहिए।

+0

हाँ! यह बिल्कुल सही है कि हर कोई सर्वोत्तम प्रथाओं के बारे में क्या कहता है। हालांकि, शायद इसलिए कि मैं कोड के साथ उस समय के विशाल बहुमत पर काम कर रहा हूं जो अधिक उच्च स्तर के अमूर्तता (जैसे व्यवसाय नियमों) पर सुविधाओं के साथ अधिक उन्मुख है, मेरे पास पिछले 12 वर्षों में ऐसी स्थिति नहीं थी जहां मेरे पास कार्यान्वयन को बदलने के लिए। हालांकि, जब आप श्रेणी को लागू करने वाले वर्ग से निपटते हैं तो मैं मामलों को देख सकता हूं और आप चाहते हैं कि इस वर्ग को अन्य मामलों में विरासत में मिला हो जहां सूची में आईएलआईस्ट का उपयोग करने का लाभ हो। – Samuel

1

विचार यह है कि कॉलर को यह तय करना है कि वे किस संग्रह का उपयोग करेंगे। आप देख सकते हैं कि बहुत से लोग IEnumerable<T> लौट रहे हैं जब भी वे कर सकते हैं। ऐसा आमतौर पर ऐसा करने के लिए अच्छा अभ्यास माना जाता है। रिटर्निंग आईएलआईस्ट कॉलर का उपयोग करने के लिए कॉलर का उपयोग करता है, जो लौटने पर सूची को पसंद करते हैं, उन्हें सूची के डेटा संग्रह में मैन्युअल रूप से सूची के डेटा की प्रतिलिपि बनाने की आवश्यकता होती है।

रिटर्निंग आईन्यूमेरेबल आदर्श है।

+0

मुझे समझ में नहीं आ रहा है कि आईएलआईस्ट वापस लौटने के लिए कॉलर को कार्यान्वयन पर निर्णय लेने की अनुमति मिलती है (हम वापस लौटने के बारे में बात कर रहे हैं, तर्क के रूप में स्वीकार नहीं कर रहे हैं, अगर आपका मतलब है) –

+0

मैं आईन्यूमेरेबल का उदाहरण लेगा क्योंकि अधिक कक्षाएं लागू होती हैं इंटरफेस। जब मैं एक ऐसी विधि को कॉल करता हूं जो एक आईनेमरेबल लौटाता है, तो मैं केवल इसके माध्यम से foreach() को तय कर सकता हूं या इसके साथ सूची/कतार/स्टैक/सॉर्टेडलिस्ट आदि बना सकता हूं। यह मुझे पसंद करता है INumerable इंटरफ़ेस के कार्यान्वयन का उपयोग करने की अनुमति देता है। दूसरी तरफ, एक सूची लौटने से मुझे सूची का उपयोग करने या उदाहरण के लिए एक स्टैक बनाने के लिए मजबूर किया जाता है और मैन्युअल रूप से सूची में से प्रत्येक आइटम को मैन्युअल रूप से दर्ज किया जाता है। –

+0

यदि मैं सूची लौटाता हूं तो आप इनमें से कोई भी बना सकते हैं (क्योंकि सूची IENumerable है)! –

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