यह पहले से ही कहा जा चुका है, लेकिन मुझे कोई जवाब सुपरकलर के रूप में नहीं दिख रहा है।
सबसे आसान तरीका है बस एक ReadOnlyCollection वापस जाने के लिए है
private List<object> objs;
public ReadOnlyCollection<object> Objs {
get {
return objs.AsReadOnly();
}
}
इस के साथ दोष यह है, यह है कि आप बाद में अपने कार्यान्वयन को बदलना चाहते हैं, तो कुछ कॉल करने को पहले से ही इस तथ्य पर निर्भर है, हो सकता है कि संग्रह यादृच्छिक पहुंच प्रदान करता है। तो एक सुरक्षित परिभाषा सिर्फ बेनकाब करने के लिए एक IEnumerable
public IEnumerable<object> Objs {
get {
return objs.AsReadOnly();
}
}
ध्यान दें कि आप इस कोड को संकलित करने के लिए AsReadOnly() कॉल करने के लिए की जरूरत नहीं है किया जाएगा। लेकिन अगर आप नहीं करते हैं, तो कॉलर ने मेरी वापसी सूची को वापस सूची में डाला और अपनी सूची संशोधित की।
// Bad caller code
var objs = YourClass.Objs;
var list = objs as List<object>;
list.Add(new object); // They have just modified your list.
ही संभावित समस्या भी इस समाधान
public IEnumerable<object> Objs {
get {
return objs.AsEnumerable();
}
}
के साथ मौजूद है तो मैं निश्चित रूप से सुझाव है कि आप आप सूची में AsReadOnly() कहते हैं, और है कि मूल्य वापस है।
ध्यान दें कि अगर आप अपने कोड में दिखाई देते हैं तो हम कभी भी * स्पष्ट * कॉल को ऑप्टिमाइज़ नहीं करेंगे। विधि कॉल में क्वेरी अभिव्यक्ति को परिवर्तित करते समय हम चयन करने के लिए निहित कॉल को ऑप्टिमाइज़ करेंगे। यदि आप कहते हैं "एक्स में वाई से जहां बी एक्स का चयन करें" कोई कॉल नहीं है, बस एक कहां है। लेकिन अगर आप कहते हैं "x में y select x" से हम "y" उत्पन्न नहीं करते हैं, तो हम परिणाम की अपरिवर्तनीयता सुनिश्चित करने के लिए एक चुनिंदा कॉल उत्पन्न करते हैं। –