2008-12-24 9 views
44

बनाम मैं Initialize generic object with unknown type पर जॉन से इस जबाब देखा:ArrayList सूची <object>

आप के लिए एक एकल संग्रह मूल्यों के कई असंबंधित प्रकार, तथापि शामिल चाहते हैं, आप का उपयोग करना होगा List<object>

मैं ArrayList बनाम List<>, लेकिन बनाम List<object>ArrayList की तुलना नहीं कर रहा हूँ, के रूप में दोनों प्रकारके तत्वों को उजागर किया जाएगा 10। इस मामले में किसी एक का उपयोग करने का क्या फायदा होगा?

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

संपादित करें: उत्तर के लिए धन्यवाद मार्क ग्रेवेल और शॉन। क्षमा करें, मैं केवल 1 जवाब के रूप में चुन सकता हूं, इसलिए मैं दोनों को वोट दूंगा।

उत्तर

69

आप LINQ विस्तार तरीकों List<object> के साथ सीधे उपयोग करने के लिए सक्षम हो जाएगा, लेकिन ArrayList साथ नहीं, जब तक आप (बनाम IEnumerableIEnumerable<object> करने के लिए धन्यवाद) एक Cast<object>()/OfType<object> इंजेक्षन। यह काफी हद तक लायक है, भले ही आपको टाइप सुरक्षा आदि की आवश्यकता न हो।

गति वही होगी; structs अभी भी बॉक्स किया जाएगा, आदि - तो उन्हें अलग करने के लिए और कुछ नहीं है। सिवाय इसके कि मुझे ArrayList "ओप्स" के रूप में देखना है, "कोई व्यक्ति विरासत कोड फिर से लिख रहा है ..." ;-p

-4

सूची <> ArrayList का एक प्रकार का संस्करण है। यह गारंटी देगा कि आपको संग्रह में एक ही ऑब्जेक्ट प्रकार मिलेगा।

+1

जाहिर है मैं यहाँ सुरक्षा टाइप – faulty

5

हां, टाइपएफ़ होने के अलावा, जेनेरिक संग्रह वास्तव में तेज़ हो सकते हैं।

से MSDN (http://msdn.microsoft.com/en-us/library/system.collections.generic.aspx)

System.Collections.Generic नाम स्थान इंटरफेस और वर्गों है कि जेनेरिक संग्रह है, जो करने के लिए उपयोगकर्ताओं दृढ़ता से टाइप किया संग्रह है कि बेहतर प्रदान बनाने की अनुमति देने को परिभाषित होता है गैर-जेनेरिक दृढ़ता से टाइप किए गए संग्रहों की तुलना में सुरक्षा और प्रदर्शन टाइप करें।

+2

'सूची ' आप बहुत इन सुधारों का एक 'ArrayList' अधिकांश का उपयोग करने पर सुरक्षा और प्रदर्शन टाइप करने के लिए सुधार के रास्ते में नहीं देता है करने के लिए' सूची के लिए विशिष्ट हैं जिक्र नहीं कर रहा हूँ 'जहां टी' ऑब्जेक्ट 'को छोड़कर कुछ भी है। – Brian

38

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

मैं गैर-जेनेरिक कक्षाओं/इंटरफेस को विरासत कोड के रूप में सोचता हूं और जब भी संभव हो उससे बचता हूं।

+0

वह एक कोण था जिसे मैंने नहीं सोचा था, अच्छा पकड़। –

11

इस मामले में, ArrayList बनाम List<Object> तो आप गति में कोई अंतर नहीं देखेंगे। इनमें से प्रत्येक पर उपलब्ध वास्तविक विधियों में कुछ अंतर हो सकते हैं, विशेष रूप से .NET 3.5 में और एक्सटेंशन विधियों की गणना करना, लेकिन इसके अलावा ArrayList को कुछ और चीज़ों से कुछ हद तक बहिष्कृत किया जाना है।

1

कुछ बेंचमार्किंग करें और आपको पता चलेगा कि सबसे अच्छा क्या करता है। मैं अतिथि हूं कि अंतर बहुत छोटा है।

+0

असल में मुझे यकीन नहीं है कि सवाल प्रदर्शन के बारे में है लेकिन यह एक अच्छा मुद्दा है। मेरा अनुमान है कि अतिरिक्त मुक्केबाजी, अनबॉक्सिंग के कारण सरणीसूची perf बदतर हो जाएगी। –

+0

@ नाम: क्या अतिरिक्त मुक्केबाजी? 'ArrayList' और 'सूची ' में समान बॉक्सिंग/अनबॉक्सिंग होना चाहिए। – Brian

+0

"एक एकल संग्रह जिसमें कई असंबंधित प्रकार के मान शामिल हैं" - मेरी समझ यह थी कि सूची संग्रह ऑब्जेक्ट में विभिन्न प्रकार जोड़ते समय वहां मुक्केबाजी/अनबॉक्सिंग होती थी, जबकि सरणी सूची के साथ नहीं था। मुझे लगता है कि मैं इसके बारे में गलत हूं। –