दिलचस्प पोस्ट
अमान्य enum मान को int क्यों कास्टिंग नहीं अपवाद नहीं? फायरबग कहते हैं, "इस पृष्ठ पर कोई जावास्क्रिप्ट नहीं", भले ही जावास्क्रिप्ट पेज पर मौजूद हो प्रकार सुरक्षा: अनचेक किए गए कलाकार एक स्क्रिप्ट टैग के भीतर आवश्यक सीडीएटीए अनुभाग कब है? समान ऑब्जेक्ट में डुप्लिकेट प्रॉपर्टी नामों के साथ JSON को डिसेरीज़ कैसे करें पायथन और पीआईपी, उपलब्ध पैकेज के सभी संस्करणों की सूची है? मैं एक फ़ाइल में एक बहुरालीन पैटर्न कैसे खोज सकता हूं? क्या पायथन के साथ sys.path सेट करता है, और कब? लिनक्स में / proc / pid / pagemap प्रविष्टियों को डिकोड कैसे करें? जावास्क्रिप्ट विस्तार वस्तुओं मैं स्ट्रिंग ऑब्जेक्ट को हैश ऑब्जेक्ट में कैसे रूपांतरित कर सकता हूं? कस्टम std :: सेट तुलनित्र का उपयोग करना क्या एक विशेषता चयनकर्ता के बीच में एक सीएसएस वाइल्डकार्ड का उपयोग करना संभव है? जांच कैसे करें कि कक्षा कहीं मौजूद है या नहीं? मैं बीच में तर्कों के साथ एक PowerShell उपनाम कैसे लिख सकता हूं?

सी #: सूची <टी> और संग्रह के बीच अंतर <टी> (सीए 1002, जेनेरिक सूचियों का खुलासा न करें)

यहां पर एक परियोजना पर रन संहिता विश्लेषण चलाने की कोशिश की, और कई चेतावनियां मिली जो इस तरह से कुछ कहा:

CA1002: माइक्रोसॉफ्ट.डिज़ाइन: संग्रह का उपयोग करने के लिए ' SomeClass.SomeProtectedOrPublicProperty ' में 'सूचीबद्ध करें < SomeType >' बदलें, केवल पढ़ने के लिए या कुंजीबद्ध कलेक्शन

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

System.Collections.Generic.List (टी) _ एक सामान्य संकलन जो प्रदर्शन के लिए नहीं किया गया है और इसलिए, कोई आभासी सदस्यों को शामिल नहीं करता है।

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

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

Solutions Collecting From Web of "सी #: सूची <टी> और संग्रह के बीच अंतर <टी> (सीए 1002, जेनेरिक सूचियों का खुलासा न करें)"

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

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

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

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

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

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