अधिक आधुनिक समाधान
जब तक आपको आंतरिक संग्रह को म्यूट करने की आवश्यकता नहीं होती है, तब तक आप System.Collections.Immutable
पैकेज का उपयोग कर सकते हैं , अपने फ़ील्ड प्रकार को एक अपरिवर्तनीय संग्रह के रूप में बदल सकते हैं, और फिर सीधे उजागर कर सकते हैं - Foo
खुद को अपरिवर्तनीय मानते हैं ।
सीधे सवाल का जवाब देने के लिए अद्यतित उत्तर
क्या किसी IEnumerable के बजाय ReadOnlyCollection के रूप में एक आंतरिक संग्रह को उजागर करने का कोई कारण है यदि कॉलिंग कोड केवल संग्रह पर पुनरावृत्त करता है?
यह इस बात पर निर्भर करता है कि आप कॉलिंग कोड पर कितना भरोसा करते हैं। यदि आप हर उस चीज़ पर पूर्ण नियंत्रण रखते हैं जो कभी इस सदस्य को कॉल करेगी और आप गारंटी देते हैं कि कोई भी कोड कभी भी उपयोग नहीं करेगा:
ICollection<Foo> evil = (ICollection<Foo>) bar.Foos;
evil.Add(...);
फिर निश्चित रूप से, यदि आप सीधे संग्रह वापस करते हैं तो कोई नुकसान नहीं होगा। मैं आमतौर पर उस से थोड़ा अधिक पागल होने की कोशिश करता हूं।
इसी तरह, जैसा कि आप कहते हैं: यदि आपको केवल आवश्यकता है IEnumerable<T>
, तो अपने आप को मजबूत किसी भी चीज़ से क्यों बाँधें?
मूल उत्तर
यदि आप .NET 3.5 का उपयोग कर रहे हैं, तो आप कॉपी बनाने से बच सकते हैं और सरल कॉल को छोड़ कर सरल कास्ट से बच सकते हैं :
public IEnumerable<Foo> Foos {
get { return foos.Skip(0); }
}
(तुच्छ रूप से लपेटने के लिए बहुत सारे अन्य विकल्प हैं - Skip
सेलेक्ट / ओवर के बारे में अच्छी बात यह है कि प्रत्येक पुनरावृत्ति के लिए निरर्थक निष्पादित करने के लिए कोई प्रतिनिधि नहीं है।)
यदि आप .NET 3.5 का उपयोग नहीं कर रहे हैं, तो आप एक ही काम करने के लिए एक बहुत ही सरल आवरण लिख सकते हैं:
public static IEnumerable<T> Wrapper<T>(IEnumerable<T> source)
{
foreach (T element in source)
{
yield return element;
}
}
ReadOnlyCollection
यदि आप पागल हैं, लेकिन अब आप एक विशिष्ट कार्यान्वयन से बंधे नहीं हैं।