2013-07-01 8 views
33

List<T>IReadOnlyCollection<T> इंटरफ़ेस लागू करता है और AsReadOnly() तरीका है जिसके ReadOnlyCollection<T> रिटर्न (बदले में लागू करता है जो IReadOnlyCollection<T>) प्रदान करता है।सूची <T> .AsReadOnly() बनाम IReadOnlyCollection <T>

AsReadyOnly() के लिए उपयोग/कारण क्या है? इसका अस्तित्व एक या दो किनारे के मामलों की गंध करता है जहां सूची को IReadOnlyCollection<T> के रूप में वापस लौटना पर्याप्त नहीं है।

सबसे पहले हालांकि यह लागत-लागत को दूर करने से रोकने के लिए हो सकता है लेकिन ऐसा लगता है कि आप ReadOnlyCollection<T> के Items एक्सेसर के साथ ऐसा कर सकते हैं।

बीटीडब्ल्यू। ReadOnlyCollection<T> प्रकार के लिए प्रलेखन

सामान्य सामान्य-केवल संग्रह के लिए बेस क्लास प्रदान करता है।

जो, मेरे सिर में, एक निर्माता के रूप में

वर्णित होने के साथ संघर्ष (...) वर्ग निर्दिष्ट सूची के चारों ओर केवल पढ़ने के लिए आवरण है कि का एक नया उदाहरण आरंभीकृत।

अद्यतन: मैं नहीं देखा था कि ReadOnlyCollection<T> के Items सुरक्षित है।

+0

मैं '.ToArray()' पसंद करता हूं। सरल आईएमओ! –

+1

@ किरेन जोहानस्टोन शायद धीमे भी। –

उत्तर

36

यदि आप IReadOnlyList<T> के रूप में वास्तविक List<T> वापस लौटते हैं, तो कॉलर हमेशा इसे वापस ला सकता है, और फिर सूची को संशोधित कर सकता है। इसके विपरीत, AsReadOnly() पर कॉल करने से सूची का केवल-पढ़ने वाला रैपर बनाता है, जो उपभोक्ता अपडेट नहीं कर सकते हैं।

ध्यान दें कि केवल-पढ़ने वाले रैपर अंतर्निहित सूची में किए गए परिवर्तनों को प्रतिबिंबित करेंगे, इसलिए मूल सूची तक पहुंच के साथ कोड अभी भी ज्ञान के साथ अपडेट कर सकता है कि केवल पढ़ने वाले संस्करण के किसी भी उपभोक्ता को उन परिवर्तनों को दिखाई देगा। AsReadOnly() और IReadOnlyList<T>: -

सब इसकी वजह IReadOnlyList<T> पर्याप्त नहीं होता कि AsReadOnly() जोड़ा गया है नहीं है की
+0

लेकिन मैं वापस 'AsReadOnly() आइटम' वापस डाल सकता हूं, है ना? – mayu

+5

@Tymek आप नहीं कर सकते: 'AsReadOnly()' एक नया, गैर-लिस्ट 'वर्ग बनाता है, जिसमें अंतर्निहित सूची के उत्परिवर्तन की अनुमति देने वाली कोई सार्वजनिक विधि नहीं है। ('आइटम' * संरक्षित * * है, इसलिए यादृच्छिक उपभोक्ता इसका उपयोग नहीं कर सकते हैं।) – dlev

+0

आइटम मूल सूची नहीं है, आप मूल सूची नहीं बदल सकते हैं। – Steven

18

पहले IReadOnlyList<T> ही उपलब्ध .NET 4.5 के साथ शुरू करते हुए AsReadOnly() विधि 2.

इससे भी महत्वपूर्ण बात नेट के बाद से मौजूद है बहुत अलग उद्देश्यों की सेवा करते हैं।

ReadOnlyCollection<T> ऑब्जेक्ट मॉडल को लागू करने के लिए है, उदाहरण के लिए Dictionary<K,V>.Keys और Dictionary<K,V>.Values जैसी चीजें। यह उन परिदृश्यों के लिए है जहां उपभोक्ता सामग्री के दौरान सामग्री को बदलने में सक्षम नहीं होना चाहिए। यह Collection<T> के साथ मिलकर काम करता है जो मालिकों के लिए परिवर्तनों को सत्यापित करने या आइटम जोड़े जाने पर साइड इफेक्ट्स करने के लिए हुक प्रदान करता है।

IReadOnlyList<T> दूसरी तरफ बस एक इंटरफेस है जो संग्रह के केवल पढ़ने के दृश्य प्रदान करता है। विधियों का उपयोग यह कहने के लिए किया जा सकता है कि "मुझे यादृच्छिक अभिगम संग्रह की आवश्यकता है लेकिन मुझे इसे संशोधित करने में सक्षम होने की आवश्यकता नहीं है"।उदाहरण के लिए, एक BinarySearch विधि इस प्रकार दिखाई देंगे:

public int BinarySearch<T>(IReadOnlyList<T> list, int start, int length); 

आदेश इस विधि उपयोगी बनाने के लिए, यह किसी भी सूची में पारित करने के लिए सक्षम होने के लिए आवश्यक है। रैपर संग्रह बनाने के लिए मजबूर करना बेहद महंगा होगा।

संबंधित मुद्दे