के बजाय IReadOnlyCollection<T>
या IReadOnlyList<T>
विधि हस्ताक्षर में उपयोग करना IEnumerable<T>
, यह स्पष्ट करने का लाभ है कि आपको पुनरावृत्ति से पहले गिनती की जांच करने की आवश्यकता हो सकती है, या किसी अन्य कारण से कई बार पुनरावृति करने की आवश्यकता हो सकती है।
हालाँकि, उनके पास एक बड़ा नकारात्मक पहलू है जो समस्याओं का कारण बनेगा यदि आप अपने कोड को रीफ़्रैक्टर का उपयोग करने के लिए रीफ़्रैक्टर करने का प्रयास करते हैं, उदाहरण के लिए इसे गतिशील प्रॉक्सिंग के लिए अधिक परीक्षण योग्य और अनुकूल बनाने के लिए। मुख्य बिंदु यह है कि IList<T>
इनसे विरासत में नहीं मिलता हैIReadOnlyList<T>
, और इसी तरह अन्य संग्रह और उनके संबंधित केवल-पढ़ने के लिए इंटरफेस है। (संक्षेप में, यह इसलिए है क्योंकि .NET 4.5 पहले संस्करणों के साथ ABI संगतता रखना चाहता था। लेकिन उन्होंने .NET .NET में बदलने का अवसर नहीं लिया। )
इसका मतलब यह है कि यदि आप IList<T>
कार्यक्रम के कुछ हिस्से से प्राप्त करते हैं और इसे दूसरे भाग में पास करना चाहते हैं जो एक उम्मीद करता है IReadOnlyList<T>
, तो आप नहीं कर सकते हैं! आप हालांकि एक के IList<T>
रूप में पारित कर सकते हैंIEnumerable<T>
।
अंत में, IEnumerable<T>
सभी .NET इंटरफेस सहित सभी .NET संग्रह द्वारा समर्थित एकमात्र रीड-ओनली इंटरफ़ेस है। कोई अन्य विकल्प आपको काटने के लिए वापस आ जाएगा जैसा कि आप महसूस करते हैं कि आपने खुद को कुछ वास्तुकला विकल्पों से बाहर कर दिया है। इसलिए मुझे लगता है कि यह व्यक्त करने के लिए फ़ंक्शन हस्ताक्षरों में उपयोग करने के लिए उचित प्रकार है जिसे आप केवल पढ़ने के लिए संग्रह चाहते हैं।
(ध्यान दें कि आप हमेशा एक IReadOnlyList<T> ToReadOnly<T>(this IList<T> list)
एक्सटेंशन मेथड लिख सकते हैं जो सरल कास्ट करता है यदि अंतर्निहित प्रकार दोनों इंटरफेस का समर्थन करता है, लेकिन आपको रिफैक्टिंग करते समय इसे हर जगह मैन्युअल रूप से जोड़ना होगा, जहां IEnumerable<T>
हमेशा संगत होता है।)
हमेशा की तरह यह एक पूर्ण नहीं है, यदि आप डेटाबेस-भारी कोड लिख रहे हैं, जहां आकस्मिक एकाधिक गणना एक आपदा होगी, तो आप एक अलग व्यापार बंद पसंद कर सकते हैं।