2009-10-27 21 views
5

मेरे पास मेरी व्यावसायिक वस्तु में उत्पाद नामक एक वर्ग है और दूसरी कक्षा में मैं इस वर्ग की वस्तुओं की एक सूची वापस करना चाहता हूं। मुझे किस दृष्टिकोण का उपयोग करना चाहिए?सी # जेनिक्स: सूची <Object> या नई कक्षा सूची

public static List<Product> GetProductList() { .... } 

या productlist कहा जाता है मेरी व्यापार वस्तु namspace में अन्य वर्ग जो List <Products> फैली इस प्रकार बनाने के लिए:

public class ProductList :List<Products > { .... } 

और वहाँ

public static ProductList GetProductList() { .... } 

इसका इस्तेमाल वहाँ इन दोनों के बीच कोई अंतर है? स्मृति आवंटन और प्रदर्शन कितना abt?

उत्तर

9

अतिरिक्त प्रकार (ProductList) रखने में एक छोटा ओवरहेड है, लेकिन कुछ भी बड़ा नहीं है। लेकिन यह है वास्तव में आप जो करना चाहते हैं उस पर निर्भर करता है। कई तरीकों से, ProductList अभी भी एक बुरा विचार है क्योंकि यह सार्वजनिक एपीआई में List<T> जलता है, और List<T> बहुत विस्तार योग्य नहीं है (उदाहरण के लिए virtual, विधियों में से कोई भी नहीं है)। Collection<T> में अधिक विस्तार क्षमता हो सकती है।

मैं अमूर्त या कैप्सूलीकरण के पक्ष में तर्क चाहते हैं:

public static IList<Product> GetProductList() {...} // abstraction; can return 
                // List<Product> if we want 

या:

public class ProductList : IList<Product> {...} // encapsulation, but need to 
               // add a lot of dull code 

यह एक शर्म की बात है कि सी # कैप्सूलीकरण दृष्टिकोण सरल नहीं है (मैं सोच रहा हूँ है "mixins")।

ध्यान दें कि IList<Product> पर अतिरिक्त विधियों के भ्रम को जोड़ने के लिए एक और चाल (कभी-कभी उपयुक्त, कभी नहीं) विस्तार विधियों का उपयोग करना होगा ... यह एक मुश्किल बहस है, इसलिए मैं बस इसका उल्लेख कर रहा हूं, " यह करो"।

+0

सार्वजनिक स्थिर IList GetProductList() {...} एक तरीका है, लेकिन क्या जनता स्थिर productlist करता है: IList {...} मतलब है? – Max

+1

इसका मतलब है कि मेरे पास एक कॉपी/पेस्ट बग है ;-p –

+0

आह, ठीक है, मुझे पहले से ही डर है कि सी # में और भाषा भाषा संरचनाएं अभी तक नहीं हैं। ;) – Max

7

जेनिक्स का उद्देश्य कोड पुन: उपयोग को बढ़ावा देने के लिए अन्य चीजों के साथ था। आपका पहला दृष्टिकोण उचित से अधिक है।

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

0

आवंटित स्मृति की मात्रा समान होनी चाहिए, लेकिन दूसरा विकल्प अधिक लचीला है क्योंकि यह आपको लौटा उत्पाद सूची में कस्टम विधियों को जोड़ने की अनुमति देता है।

कैप्सूलीकरण (या अमूर्त, धन्यवाद मार्क) के हित में, यह एक IList<Product> वापस जाने के लिए, या क्रमशः IList<Product> लागू करने के लिए, सबसे अच्छा अभ्यास है।

5

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

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

public static IEnumerable<Product> GetProductList() 
2

तुम सिर्फ उत्पाद के अनुक्रम वापस जाने के लिए चाहते हैं और सूची पर किसी भी कार्यों का उपयोग कभी नहीं होगा, तो मैं आप की तरह कुछ का उपयोग करने के सुझाव देंगे क्योंकि इसका मतलब है कि आप एक नई कक्षा नहीं बना रहे हैं। मैं ऐसा करता हूं क्योंकि यह एक सामान्य वर्ग के पर्याप्त होने पर विशेष उद्देश्य वर्गों के भार को रोकता है।

public static IList<Product> GetProductList() { .... }

0

व्यक्तिगत तौर पर मैं अपना पहला सुझाव के साथ बस जाना होगा:

2

माइक्रोसॉफ्ट कोड विश्लेषण संग्रह < टी> के बजाय सूची < टी> से पाने अनुशंसा करता है।

This blog post क्यों बताता है।

आप निम्नलिखित कारणों संग्रह < टी> से अपने खुद के संग्रह वर्ग प्राप्त कर सकते हैं:

  • अतिरिक्त कस्टम कार्यक्षमता

  • एक COMVisible दृढ़ता से टाइप संग्रह वर्ग को बेनकाब करने के लिए जोड़ने के लिए।

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