इस तरह के सवालों के जवाब: सूची <टी> या आईलिस्ट <टी> हमेशा इस बात से सहमत दिखते हैं कि एक संग्रह के ठोस कार्यान्वयन को वापस करने की तुलना में एक इंटरफ़ेस वापस करना बेहतर है। लेकिन मैं इससे जूझ रहा हूं। एक इंटरफ़ेस को इंस्टेंट करना असंभव है, इसलिए यदि आपका तरीका एक इंटरफ़ेस वापस कर रहा है, तो यह वास्तव में अभी भी एक विशिष्ट कार्यान्वयन लौटा रहा है। मैं इसके साथ 2 छोटे तरीके लिखकर थोड़ा प्रयोग कर रहा था:
public static IList<int> ExposeArrayIList()
{
return new[] { 1, 2, 3 };
}
public static IList<int> ExposeListIList()
{
return new List<int> { 1, 2, 3 };
}
और मेरे परीक्षण कार्यक्रम में उनका उपयोग करें:
static void Main(string[] args)
{
IList<int> arrayIList = ExposeArrayIList();
IList<int> listIList = ExposeListIList();
//Will give a runtime error
arrayIList.Add(10);
//Runs perfectly
listIList.Add(10);
}
दोनों मामलों में जब मैं एक नया मूल्य जोड़ने की कोशिश करता हूं, तो मेरा संकलक मुझे कोई त्रुटि नहीं देता है, लेकिन जाहिर है कि विधि जो मेरे सरणी को उजागर करती IList<T>
है एक रनटाइम त्रुटि देती है जब मैं इसमें कुछ जोड़ने की कोशिश करता हूं। लोग हैं, जो नहीं जानता कि मेरी विधि में हो रहा है, और है यह करने के लिए मान जोड़ने के लिए तो, करने के लिए मजबूर कर रहे हैं पहले मेरी नकल IList
एक करने के लिए List
त्रुटियों का जोखिम लिए बिना मान जोड़ने के लिए सक्षम होने के लिए। बेशक वे यह देखने के लिए टाइपकास्ट कर सकते हैं कि वे एक List
या एक के साथ काम कर रहे हैं Array
, लेकिन अगर वे ऐसा नहीं करते हैं, और वे संग्रह में आइटम जोड़ना चाहते हैं, तो उनके पास कॉपी करने के IList
लिए कोई अन्य विकल्प नहीं है List
, भले ही यह पहले से ही एक हैList
। क्या किसी सरणी को कभी उजागर नहीं किया जाना चाहिए IList
?
मेरी एक और चिंता लिंक किए गए प्रश्न (जोर मेरा) के स्वीकृत उत्तर पर आधारित है :
यदि आप अपनी कक्षा को एक पुस्तकालय के माध्यम से उजागर कर रहे हैं जिसका उपयोग अन्य लोग करेंगे, तो आप आम तौर पर ठोस कार्यान्वयन के बजाय इंटरफेस के माध्यम से इसे उजागर करना चाहते हैं।यदि आप बाद में एक अलग ठोस वर्ग का उपयोग करने के लिए अपनी कक्षा के कार्यान्वयन को बदलने का निर्णय लेते हैं तो यह मदद करेगा। उस स्थिति में जब तक इंटरफ़ेस नहीं बदलेगा, आपके पुस्तकालय के उपयोगकर्ताओं को अपना कोड अपडेट करने की आवश्यकता नहीं होगी।
यदि आप इसे आंतरिक रूप से उपयोग कर रहे हैं, तो आप इतना ध्यान नहीं दे सकते हैं, और सूची का उपयोग करना ठीक हो सकता है।
कल्पना कीजिए कि किसी ने वास्तव में मेरे द्वारा उपयोग की IList<T>
गई ExposeListIlist()
विधि को मानों को जोड़ने / हटाने के लिए मेरे तरीके से उपयोग किया है । सब कुछ ठीक काम करता है। लेकिन अब जैसे उत्तर का सुझाव देता है, क्योंकि एक इंटरफ़ेस वापस करना अधिक लचीला है मैं एक सूची के बजाय एक सरणी लौटाता हूं (मेरी तरफ कोई समस्या नहीं!), फिर वे एक इलाज के लिए हैं ...
TLDR:
1) एक इंटरफ़ेस को एक्सपोज़ करने से अनावश्यक कास्ट होती है? क्या इससे कोई फर्क नहीं पड़ता?
2) कभी-कभी यदि लाइब्रेरी के उपयोगकर्ता किसी कास्ट का उपयोग नहीं करते हैं, तो जब आप अपना तरीका बदलते हैं तो उनका कोड टूट सकता है, भले ही वह तरीका पूरी तरह से ठीक हो।
मैं शायद इसे खत्म कर रहा हूं, लेकिन मुझे यह आम सहमति नहीं है कि एक इंटरफ़ेस वापस करना एक कार्यान्वयन वापस करने पर पसंद किया जाना है।
IEnumerable<T>
और आपके पास समय सुरक्षा है। आप अभी भी सभी LINQ एक्सटेंशन विधियों का उपयोग कर सकते हैं जो आम तौर पर एक विशिष्ट प्रकार के लिए कास्टिंग करके प्रदर्शन का अनुकूलन करने की कोशिश करते हैं (जैसेICollection<T>
किCount
संपत्ति का उपयोग करने के बजाय इसे एन्यूमरेट करने के लिए)।