प्रश्न का "क्यों" भाग का उत्तर देने के लिए क्यों नहीं List<T>
, इसका कारण भविष्य के प्रमाण और एपीआई सादगी हैं।
भविष्य प्रूफिंग
List<T>
इसे उप-वर्ग द्वारा आसानी से एक्स्टेंसिबल करने के लिए डिज़ाइन नहीं किया गया है; यह आंतरिक कार्यान्वयन के लिए तेज़ होने के लिए डिज़ाइन किया गया है। आप इस पर ध्यान देंगे कि विधियाँ आभासी नहीं हैं और इसलिए इसे ओवरराइड नहीं किया जा सकता है, और इसके Add
/ Insert
/ Remove
संचालन में कोई हुक नहीं हैं ।
इसका मतलब यह है कि यदि आपको भविष्य में संग्रह के व्यवहार में परिवर्तन करने की आवश्यकता है (उदाहरण के लिए, उन अशक्त वस्तुओं को अस्वीकार करना, जिन्हें लोग जोड़ने की कोशिश करते हैं, या अतिरिक्त कार्य करने के लिए जब ऐसा होता है जैसे कि आपकी कक्षा की स्थिति को अपडेट करना) तो आपको प्रकार बदलने की आवश्यकता है आपके द्वारा संग्रहित किए जाने वाले संग्रह में आप एक उपवर्ग पर वापस लौट सकते हैं, जो एक ब्रेकिंग इंटरफ़ेस परिवर्तन होगा (ज़ाहिर है कि चीजों के शब्दार्थ को बदलना, जैसे कि शून्य की अनुमति देना भी इंटरफ़ेस परिवर्तन नहीं हो सकता है, लेकिन आपके आंतरिक वर्ग की स्थिति को अपडेट करने जैसी चीजें नहीं होगी)।
इसलिए या तो एक ऐसे वर्ग को लौटाया जा सकता है, जिसे आसानी से उप-वर्ग में रखा जा सकता है जैसे कि Collection<T>
या एक इंटरफ़ेस जैसे IList<T>
, ICollection<T>
या IEnumerable<T>
आप अपनी आंतरिक कार्यान्वयन को अपनी आवश्यकताओं को पूरा करने के लिए एक अलग संग्रह प्रकार के रूप में बदल सकते हैं, उपभोक्ताओं के कोड को तोड़े बिना, क्योंकि इसे अभी भी लौटाया जा सकता है। प्रकार वे उम्मीद कर रहे हैं।
एपीआई सादगी
List<T>
इसमें बहुत सारे उपयोगी संचालन शामिल हैं जैसे कि BinarySearch
, Sort
और इसी तरह। हालाँकि यदि यह एक संग्रह है जिसे आप उजागर कर रहे हैं तो यह संभावना है कि आप सूची के शब्दार्थ को नियंत्रित करते हैं, न कि उपभोक्ताओं को। इसलिए जब आपकी कक्षा को आंतरिक रूप से इन कार्यों की आवश्यकता हो सकती है, तो यह बहुत कम संभावना है कि आपके वर्ग के उपभोक्ता उन्हें (या यहां तक कि) उन्हें कॉल करना चाहते हैं।
जैसे, एक सरल संग्रह वर्ग या इंटरफ़ेस की पेशकश करके, आप उन सदस्यों की संख्या कम कर देते हैं जिन्हें आपके API के उपयोगकर्ता देखते हैं, और उनका उपयोग करना आसान बनाते हैं।