2009-01-30 21 views
8

में सूची (टी) में संग्रह के साथ आपको क्या लाभ मिलता है। मेरे पास एक अन्य डेवलपर पूछता था कि मैं पूरे स्थान पर सूची का उपयोग क्यों करता हूं ... और मैंने इसके बारे में एक मिनट के लिए सोचा ... और एक निश्चित उत्तर के साथ नहीं आ सकता था।.NET 2.0+

यदि आप संग्रह (बेस) का उपयोग करने के बजाय संग्रह बेस क्लास से विस्तार करने के लिए उत्तराधिकारी हैं - आपको क्या फायदे मिलते हैं? या - आपको सूची के साथ क्या नहीं मिलता है?

उत्तर

4

जेनेरिक सूची आपको प्रदर्शन को बढ़ावा देती है।

Do C# Generics Have a Perfomance Benefit?

उद्धरण MSDN से:

यह अपने लाभ के (< के ( सूची < की विशेष प्रकार के कार्यान्वयन का उपयोग करने के लिए है

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

1

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

0

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

क्रिस्टोफ़ क्वालीना, बीसीएल के डिजाइनरों में से एक है, इस सूची < टी > के बारे में क्या कहना है:

क्यों हम सार्वजनिक APIs में सूची < टी > उपयोग करने की अनुशंसा नहीं करते

हम दो कारणों से सार्वजनिक एपीआई में सूची < टी > का उपयोग करने की अनुशंसा नहीं करें।

  • सूची < टी > बढ़ाया जा करने के लिए डिज़ाइन नहीं किया गया है। यानी आप किसी भी सदस्य को ओवरराइड नहीं कर सकते हैं। उदाहरण के लिए इसका मतलब है कि किसी वस्तु से सूची < टी > लौटने वाली ऑब्जेक्ट संग्रहित होने पर अधिसूचित नहीं हो पाएगा। संग्रह < टी > आपको सेटइटम संरक्षित सदस्य को "अधिसूचित" करने के लिए ओवरराइड करने देता है जब कोई नया आइटम जोड़ा जाता है या कोई मौजूदा आइटम बदल जाता है।
  • सूची < टी > में ऐसे कई सदस्य हैं जो कई परिदृश्यों में प्रासंगिक नहीं हैं। हम कहते हैं कि सूची < टी > सार्वजनिक ऑब्जेक्ट मॉडल के लिए भी "व्यस्त" है। ListView की कल्पना करें। संपत्ति की वापसी सूची < टी > इसकी समृद्धि के साथ। अब, वास्तविक सूची दृश्य देखें।आइटम वापसी प्रकार; यह आसान तरीका है और संग्रह < टी > या ReadOnlyCollection < टी > के समान है।

Source

+0

क्या आप इस एमएस सिफारिश के लिए एक लिंक प्रदान कर सकते हैं? मुझे संदेह है कि एफडब्ल्यू के भविष्य के संस्करणों में से किसी भी बेस क्लास को बदला जा सकता है। – aku

+0

सीएलआर भी बीसीएल को प्रभावित नहीं करता है, तो यह सूची को कैसे प्रभावित कर सकता है? – aku

+0

एमएस के संस्करणों के बीच संगतता बनाए रखने के तरीके से बाहर निकलने का इतिहास है। मुझे लगता है कि सूची (टी) में एक तोड़ने का परिवर्तन बेहद असंभव है। – ScottS

1

एक सामान्य सूची <> गति और आंतरिक उपयोग के लिए डिजाइन किया गया है। दूसरी ओर जेनेरिक संग्रह <> को विस्तारशीलता के लिए डिज़ाइन किया गया है।

संग्रह < के लाभों में से एक> वर्ग है कि आप कुछ अलग तरीके (ClearItems(), InsertItem(), RemoveItem() और SetItem()) को ओवरराइड कर सकते है। दूसरी ओर, सामान्य सूची <> प्रकार, कोई भी तरीका प्रदान नहीं करता है जिसे अतिरंजित किया जा सकता है।

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

1

कास्टिंग लागत का समय टाइप करें, और जब आप जेनिक्स का उपयोग कर रहे हों तो इसे रोका जा सकता है। यदि आप सूची (टी का उपयोग) का उपयोग करते हैं तो कोई प्रकार का कास्टिंग आवश्यक नहीं है, क्योंकि यह एक मजबूत टाइप किया गया संग्रह होगा। यदि आप ArrayList का उपयोग करते हैं तो आप ऑब्जेक्ट से अपने स्वयं के प्रकार में कास्टिंग कर रहे हैं और इसके विपरीत, जो अतिरिक्त ओवरहेड का कारण बनता है।

इसके अलावा, आप प्रकार कास्टिंग समस्याओं को रोकते हैं जिन्हें आप संकलित समय पर नहीं ढूंढ सकते हैं। (उदाहरण के लिए, एक सरणी सूची में एक int जोड़ना जिसमें स्ट्रिंग्स होनी चाहिए, जब आप सरणी सूची का उपयोग करते हैं तो कोई समस्या नहीं होती है, लेकिन जब आप रन टाइम पर int की अपेक्षा नहीं करते हैं तो अमान्यकास्टेसेप्शन का कारण बन सकता है। जेनेरिक सूचियों या संग्रहों का उपयोग करना इससे रोकता है क्योंकि कोड संकलित नहीं होगा।)

उम्मीद है कि इससे मदद मिलती है।

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