जैसा कि मैं आम तौर पर केवल गुण/विधियों से अपरिवर्तनीय (अप्रचलित) वस्तुएं लौटाता हूं, यह उत्तर मानता है कि आप ऐसा करना चाहते हैं।
ReadOnlyCollection<T>
को न भूलें जो एक अपरिवर्तनीय संग्रह लौटाता है जिसे अभी भी अनुक्रमणिका द्वारा एक्सेस किया जा सकता है।
आप IEnumerable<T>
का उपयोग कर और बेकाबू जंगल में अपने प्रकार जारी कर रहे हैं, तो इस से सावधान रहना:
:
class MyClass {
private List<int> _list;
public IEnumerable<int> Numbers {
get { return _list; }
}
}
कोई उपयोगकर्ता इस और गंदगी अपने वर्ग की आंतरिक स्थिति के रूप में कर सकता है
var list = (List<int>)myClass.Numbers;
list.Add(123);
यह संपत्ति के लिए केवल पढ़ने के इरादे का उल्लंघन करेगा। ऐसे मामलों में, अपने गेटर इस तरह दिखना चाहिए:
public IEnumerable<int> Numbers {
get { return new ReadOnlyCollection<int>(_list); }
}
वैकल्पिक रूप से आप _list.ToReadOnly()
कह सकते हैं। मैंने इसे दिखाने के लिए इसे पूरी तरह से लिखा था।
इससे आपके राज्य को संशोधित करने से रोक दिया जाएगा (जब तक वे प्रतिबिंब का उपयोग नहीं करते हैं, लेकिन जब तक आप कई कार्यात्मक प्रोग्रामिंग भाषाओं में उपयोग करने वाले अपरिवर्तनीय संग्रह नहीं बनाते, तब तक यह वास्तव में कठिन होता है, और यह एक पूरी कहानी है)।
यदि आप केवल संग्रह पढ़ रहे हैं, तो आप सदस्य को ReadOnlyCollection<T>
के रूप में घोषित करने से बेहतर हैं क्योंकि कुछ कार्य तेजी से प्रदर्शन करते हैं (गिनती प्राप्त करना, इंडेक्स द्वारा आइटम एक्सेस करना, किसी अन्य संग्रह में कॉपी करना)।
व्यक्तिगत तौर पर मैं इस तरह के ढांचे में शामिल हैं देख सकते हैं और एक इंटरफ़ेस का उपयोग करना चाहते हैं:
public interface IReadOnlyCollection<T> : IEnumerable<T>
{
T this[int index] { get; }
int Count { get; }
bool Contains(T item);
void CopyTo(T[] array, int arrayIndex);
int IndexOf(T item);
}
आप इन सभी IEnumerable<T>
की चोटी पर विस्तार तरीकों का उपयोग कर कार्यों प्राप्त कर सकते हैं, लेकिन वे के रूप में performant नहीं कर रहे हैं।
ध्यान दें कि उपर्युक्त सभी प्रकार लिनक को अलग-अलग डिग्री के लिए समर्थन देते हैं, या तो 'IENumerable' या 'IQueryable ' के माध्यम से। –