2012-12-31 15 views
8
string[] _myStrings = { "Hello", "There", "Happy", "Day" }; 

public IEnumerable<string> MyStrings1 
{ 
    get 
    { 
     return new System.Collections.ObjectModel.ReadOnlyCollection<string>(_myStrings); 
    } 
} 

public IEnumerable<string> MyStrings2 
{ 
    get 
    { 
     return from s in _myStrings select s; 
    } 
} 

मैंने सार्वजनिक गुणों के लिए सरणी का उपयोग न करने के बारे में कुछ चर्चा देखी है। मैं MyStrings2 कन्वेंशन का उपयोग कर रहा हूं। क्या मुझे कोई कारण है कि मुझे MyStrings1 का उपयोग करना चाहिए?ReadOnlyCollection IENumerable

+0

संभव डुप्लिकेट [ReadOnlyCollection या सदस्य संग्रह को उजागर करने के लिए IEnumerable?] (Http://stackoverflow.com/questions/491375/readonlycollection-or-ienumerable-for-exposing-member-collections) – nawfal

उत्तर

13

संक्षेप में: मैं अपने प्रश्न जॉन स्कीट से एक पूरी तरह से अच्छा जवाब के साथ कवर किया जाता है लगता है - ReadOnlyCollection or IEnumerable for exposing member collections?

इसके अलावा: तुम बस का अनुकरण कर सकते हैं AsReadOnly():

public ReadOnlyCollection<Abc> List 
{ 
    get { return new ReadOnlyCollection(list); } 
} 

अद्यतन:
यह list की एक प्रति नहीं बनाता है। ReadOnlyCollection डेटा की प्रतिलिपि नहीं करता है, यह सीधे आपूर्ति की गई सूची पर काम करता है। देखें documentation:

एक संग्रह जो केवल पढ़ने के लिए है, केवल एक रैपर के साथ एक संग्रह है जो संग्रह को संशोधित करने से रोकता है; इसलिए, यदि अंतर्निहित संग्रह में परिवर्तन किए जाते हैं, तो केवल-पढ़ने वाला संग्रह उन परिवर्तनों को दर्शाता है।

यह कन्स्ट्रक्टर ओ (1) ऑपरेशन है।

की
1

सीधे इसका उपयोग करने वाले सरणी को एक्सपोज़ करना मतलब है कि वे इसे संशोधित कर सकते हैं - यह encapsulation और डेटा छिपाने का उल्लंघन है।

यह एक समस्या हो सकती है जब आपकी कक्षा में कुछ आविष्कार होते हैं (यह क्या करता है और इसके डेटा के बारे में गारंटी देता है) क्योंकि यह गारंटी नहीं दे सकता है कि अन्य वर्ग अपने आंतरिक रूप से बदल सकते हैं।

एक बहुप्रचारित वातावरण में, यह एक और समस्या है, क्योंकि एक धागा डेटा में परिवर्तन कर सकता है जबकि दूसरा डेटा पढ़ने की कोशिश कर रहा है - आप आसानी से विभिन्न धागे में असंगत डेटा प्राप्त कर सकते हैं।