2008-09-11 21 views
23

अलग-अलग रखें:.NET अप्रचलित में गैर-जेनेरिक संग्रह हैं?

क्या एक प्रकार-सुरक्षित एक (हैशटेबल बनाम डिक्शनरी) पर ढीले-टाइप किए गए संग्रह को चुनने का कोई अच्छा कारण है? क्या वे अभी भी अनुकूलता के लिए हैं?

जहां तक ​​मैं समझता हूं, जेनेरिक संग्रह न केवल प्रकार-सुरक्षित होते हैं, लेकिन उनका प्रदर्शन बेहतर होता है।


यहां विषय पर एक व्यापक लेख है: An Extensive Examination of Data Structures Using C# 2.0

उत्तर

21

गैर सामान्य संग्रह इतना अप्रचलित है कि वे सिल्वरलाइट में इस्तेमाल CoreCLR से हटा दिया गया और लाइव मेष कर रहे हैं।

+0

System.Collections.BitArray के बारे में क्या साथ नहीं किया जा सकता है? वास्तव में एक सामान्य समकक्ष नहीं है। – Triynko

+0

@Triynko a BitArray विशेष उपयोगों के साथ बूलियनों का दृढ़ता से टाइप किया गया संग्रह है, ओपी जैसे ऑब्जेक्ट्स का ढीला टाइप किया गया अत्यधिक सार संग्रह नहीं है, – Novaterata

+0

गैर-जेनेरिक डिक्ट्स के बिना, आप कुशलतापूर्वक और आसानी से स्टोर कैसे करेंगे। JSON डेटा, जो शब्दकोश/हैशटेबल से भरा है: स्ट्रिंग-टू- (int/string/bool/Dictionary/list)? ऐसा लगता है कि गैर-जेनेरिक संग्रहों को त्यागना मुझे बहुत मूर्खतापूर्ण लगता है, जब वास्तविक दुनिया में अधिकांश डेटा - प्रकृति द्वारा - गैर-टाइप किए जाते हैं, और हमें आसानी से खींचने, विश्लेषण करने, परिवर्तित करने, सत्यापित करने में सहायता के लिए गैर-सामान्य सी की तरह उपकरण की आवश्यकता होती है , आदि ... नहीं? – Adam

0

हां, जहां तक ​​मैं समझता हूं कि वे केवल मौजूदा उत्पादों के साथ संगतता के लिए हैं। आपको हमेशा प्रकार के सुरक्षित संस्करण का उपयोग करना चाहिए (यानी System.Collections.Generic सिस्टम पर चयन करें। चयन)।

http://msdn.microsoft.com/en-us/library/ms379564.aspx

1

ऐसे कई उदाहरण हो सकते हैं जहां आपको अज्ञात प्रकारों, या कई अलग-अलग प्रकार की वस्तुओं की वस्तुओं को स्टोर करने की आवश्यकता हो, लेकिन यदि आप वास्तव में उन वस्तुओं के प्रकार को जानते हैं जिन्हें आप स्टोर करना चाहते हैं तो मुझे उपयोग करने का कोई कारण नहीं दिख रहा है सामान्य संस्करण।

संपादित करें: जैसा कि टिप्पणी की गई है कि आप केवल List<Object> का उपयोग कर सकते हैं - दोह!

+1

यदि आपको इस कार्यक्षमता की आवश्यकता है, तो पुरानी कार्यक्षमता प्राप्त करने के लिए केवल का सामान्य बनाएं। हमेशा जेनिक्स का उपयोग करके आपके इरादे स्पष्ट हो जाते हैं। – bradtgmurray

15

आगे बढ़ने के लिए केवल सामान्य संग्रह का उपयोग किया जाना चाहिए। संग्रह में बॉक्सिंग/अनबॉक्सिंग से बचने का लाभ भी है। यह असुरक्षित है, खासकर जब आपके पास मूल्य प्रकारों का संग्रह होता है जो सिस्टम में परिवर्तित हो जाते हैं। संग्रह पर संग्रहित होने पर ऑब्जेक्ट करें, इसलिए कॉलस्टैक की बजाय ढेर पर मानों को संग्रहीत करना।

+2

बॉक्सिंग/अनबॉक्सिंग _only_ मूल्य प्रकारों पर लागू होता है। – samjudson

+0

और जेनिक्स का उपयोग कॉम इंटरऑप के साथ नहीं किया जा सकता है। –

+0

'सिस्टम। चयन। बिटअरे'। सामान्य समकक्ष? 'सूची ' तुलना में बहुत अधिक जगह-अक्षम दिखाई देगी। – Triynko

7

सामानों के विषम संग्रह को संग्रहीत करने के लिए गैर-जेनेरिक संग्रहों का उपयोग करने के संबंध में, आप हमेशा एक ही चीज़ को पूरा करने के लिए सूची < ऑब्जेक्ट > का उपयोग कर सकते हैं। अकेले इस कारण से, मैं कहूंगा कि गैर-जेनेरिक संग्रह को फिर से स्पर्श करने के लिए लगभग कोई कारण नहीं है।

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

1

मैं कूद नहीं सकता और कहूंगा कि अप्रचलित हैं या जल्द ही हटाए जा रहे हैं। यह सच है कि आपको गैर-जेनेरिक संग्रहों का उपयोग करने से बचना चाहिए जब तक आपके पास कोई कारण नहीं है सामान्य संस्करण का उपयोग न करें। विरासत की हजारों लाइनें (इतनी विरासत नहीं) कोड अभी भी चारों ओर तैर रही है (और वर्षों तक होगी) जो गैर-जेनेरिक संग्रह जैसे कि ऐरेलिस्ट्स का समर्थन करती है। चूंकि ये केवल संग्रह .NET 1.0 और 1.1 में संग्रहित थे, इसलिए पूरे वर्ष इसका व्यापक रूप से उपयोग किया जाता है (और दुर्व्यवहार)।

मुझे अभी भी कभी-कभी .NET 1.1 में लिखे गए पुराने ओ/आर मैपर के साथ बातचीत करना होता है जो आईएलआईटी ऑब्जेक्ट देता है। मेरे पास एक तरीका है जो एक सामान्य सूची <> में रूपांतरण करता है, जो कि कुशल नहीं है, लेकिन यह वही तरीका है।

और यदि आपको एक ही सरणी (अजीब लेकिन संभव) में विभिन्न ऑब्जेक्ट्स स्टोर करने की आवश्यकता है तो आप को गैर-सामान्य संग्रह की आवश्यकता होगी। बॉक्सिंग और अनबॉक्सिंग का दंड कुछ ऐसा है जो आपको वैसे भी देना होगा।

यदि आपको लगता है कि आपको ऐसा करना है तो उनका उपयोग करने से डरो मत।

+1

और यदि आपको एक ही सरणी (अजीब लेकिन संभव) में अलग-अलग ऑब्जेक्ट्स स्टोर करने की आवश्यकता है तो आपको एक गैर-जेनेरिक संग्रह की आवश्यकता होगी।
उह, नहीं। ऑब्जेक्ट काम करने के लिए विशेष रूप से एक ageneric संग्रह बनाना ठीक है। – Joshua

2

मैं आपको बता सकता हूं कि संग्रहों का एक्सएएमएल क्रमबद्धता उन पर निर्भर करता है जो या तो IList या IDictionary को लागू करते हैं, इसलिए आने वाले कुछ समय के लिए गैर-जेनेरिक संग्रह हमारे साथ होने जा रहे हैं।

16

वहाँ भी COM दृश्यता के साथ मुद्दे हैं - कॉम इंटरॉप जेनरिक

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