2013-08-26 5 views
5

घोषित करके एक पठनीय सी # सूची कैसे बनाएं मेरी कक्षा में List<string> myList है जो मैं कक्षा उपयोगकर्ताओं के लिए पढ़ना चाहता हूं।अपनी सेट विशेषता

List<strign> myList {get;} 

private void SetListValue() 
{ 
    myList = new List<string>(); 
    myList.Add("ss"); 
} 
इस मैंने सोचा था कि मैं अपने निजी सदस्यों में मेरी कक्षा के अंदर myList मान सेट और वर्ग उपयोगकर्ताओं के लिए केवल पढ़ने के लिए यह कर सकता है जैसा

। लेकिन मुझे एहसास हुआ कि इस तरह से यह घोषणा करना कि मैं कोई मूल्य निर्धारित करने में असमर्थ हूं।

+0

आप सेट में एक एक्सेसर जोड़ते हैं। यानी: {प्राप्त करें; निजी सेट; } – phillip

+4

आपको और अधिक विशिष्ट होने की आवश्यकता है। क्या आप ग्राहकों को 'सूची' संदर्भ बदलने से रोकना चाहते हैं, या क्या आप ग्राहकों को सूची में आइटम जोड़ने या हटाने से रोकना चाहते हैं? –

+0

मैं सूची संदर्भ बदलने वाले ग्राहकों को रोकना चाहता हूं। – anmarti

उत्तर

11

प्रयास करें:

public List<string> myList {get; private set;} 

यह आपको अपने वर्ग के भीतर यह निर्धारित करने देगा, लेकिन नहीं के बाहर। ध्यान दें कि यह आपकी सूची को अपडेट करने वाले बाहरी क्लाइंट को नहीं रोक पाएगा, केवल इसका संदर्भ।

+3

यह उपभोक्ताओं को पूरे 'myList' को बदलने से रोक देगा, लेकिन वे अभी भी सूची सामग्री – STW

+1

@STW संशोधित/हटा/संशोधित कर सकते हैं मैंने उस बिंदु को स्पष्ट करने के लिए एक नोट जोड़ा है, धन्यवाद। –

0

आप एक निजी संपत्ति के साथ एक सार्वजनिक संपत्ति चाहते हैं। नीचे के अनुसार।

public List<string> myList { get; private set; } 
5

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

उदाहरण के लिए:

public class MyClass 
{ 
    public IList<string> MyList {get; private set;} 

    public MyClass() 
    { 
    MyList = new List<string>(){"One","Two", "Three"}; 
    } 
} 

public class Consumer 
{ 
    public void DoSomething() 
    { 
     MyClass myClass = new MyClass(); 

     myClass.MyList = new List<string>(); // This would not be allowed, 
              // due to the private setter 

     myClass.MyList.Add("new string"); // This would be allowed, because it's 
             // calling a method on the existing 
             // list--not replacing the list itself 
    } 
} 

आदेश सूची के सदस्यों में फेरबदल से उपभोक्ताओं को रोकने के लिए आप एक केवल-पढ़ने के इंटरफेस के रूप में यह प्रकट कर सके, इस तरह IEnumerable<string>, ReadOnlyCollection<string> के रूप में, या घोषित करने के भीतर List.AsReadOnly() फोन करके कक्षा।

public class MyClass 
{ 
    public IList<string> MyList {get; private set;} 

    public MyClass() 
    { 
    MyList = new List<string>(){"One","Two", "Three"}.AsReadOnly(); 
    } 
} 

public class Consumer 
{ 
    public void DoSomething() 
    { 
     MyClass myClass = new MyClass(); 

     myClass.MyList = new List<string>(); // This would not be allowed, 
              // due to the private setter 

     myClass.MyList.Add("new string"); // This would not be allowed, the 
             // ReadOnlyCollection<string> would throw 
             // a NotSupportedException 
    } 
} 
+1

बस एक नोट: इसे 'IENumerable ' के रूप में उजागर करना अंतर्निहित सूची में संशोधन को रोक नहीं पाएगा। उपयोगकर्ता अभी भी '' सूची में डाल सकते हैं और परिवर्तन कर सकते हैं। (लेकिन इसे बदलने के लिए काफी आसान है, इसलिए इसे 'उपज रिटर्न' का उपयोग करने के लिए सीधे लौटने की बजाय, या जैसा कि आप सुझाव देते हैं, 'List.AsReadOnly() ') –

+0

@ChrisSinclair सच है,' AsReadOnly()' विकल्पों में से बेहतर है – STW

+0

मुझे लगता है कि आपको अपने कोड पर दूसरा पास लेना पड़ सकता है। मुझे लगता है कि आपको कुछ प्रकार की घोषणाएं/प्रारंभिकरण मिला है और संकलित नहीं होगा। और संभवतः 'MyClass' आपके दूसरे उदाहरण में' MyList' में निजी रूप से संशोधन करना चाहता है। –

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