2009-08-05 7 views
90

यहाँ एक परियोजना पर भागो कोड विश्लेषण भागने की कोशिश की, और कहा कि ने कहा कि कुछ इस तरह चेतावनी के एक नंबर मिला है:सी #: सूची <T> और संग्रह <T> के बीच अंतर (CA1002, सामान्य सूचियों को बेनकाब मत)

CA1002: Microsoft.Design: परिवर्तन 'सूची < SomeType>' 'SomeClass.SomeProtectedOrPublicProperty' संग्रह, ReadOnlyCollection उपयोग करने के लिए या KeyedCollection

Wh में क्या मुझे के बजाय Collection<T> का उपयोग करना चाहिए? जब मैं msdn प्रलेखन को देखता हूं, तो वे लगभग बराबर लगते हैं। चेतावनी के लिए त्रुटि सहायता पढ़ने के बाद, मैंने पाया कि

सिस्टम। चयन। जेनरिक.लिस्ट (टी) _ एक सामान्य संग्रह प्रदर्शन के लिए डिज़ाइन नहीं किया गया है और इसलिए, इसमें कोई वर्चुअल सदस्य नहीं है।

लेकिन इसका वास्तव में क्या अर्थ है? और इसके बजाय मुझे क्या करना चाहिए?

क्या मुझे आंतरिक रूप से List<T> का उपयोग करना जारी रखना चाहिए, और फिर गुणों में new Collection<T>(someList) बदले में? या मुझे List<T> के बजाय Collection<T> का उपयोग शुरू करना चाहिए?

+2

देखें [यह ब्लॉग पोस्ट] (http://blogs.msdn.com/fxcop/archive/2006/04/27/585476।एएसपीएक्स) एक विस्तृत स्पष्टीकरण के लिए –

+1

संयोग से, यदि आप जानना चाहते हैं कि संग्रह क्यों है [System.Collections.ObjectModel तो इसे पढ़ें] (http://blogs.msdn.com/kcwalina/archive/2005/03/15/396086 .aspx) Krzysztof Cwalina द्वारा। –

उत्तर

127

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

इसलिए, सूची स्वयं को उजागर करके, आप वर्ग के सार्वजनिक अनुबंध को तोड़ने के बिना संचालन जोड़ने या निकालने के लिए अपने संग्रह को कभी भी विस्तारित नहीं कर सकते हैं।

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

+3

अच्छा जवाब! पूरी तरह से समझ में आता है: डी – Svish

+5

बस एफवाईआई, 'संग्रह ' 'सूची ' आंतरिक रूप से उदाहरण का उपयोग करता है। –

20

Collection कुछ वर्चुअल सदस्यों (सम्मिलित, निकालें, सेट, स्पष्ट) का खुलासा करता है कि आप ओवरराइड कर सकते हैं और संग्रह बदलते समय अतिरिक्त कार्यक्षमता (जैसे अधिसूचना ईवेंट) प्रदान कर सकते हैं।

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

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

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