मुझे पता है कि मुझे किसी संपत्ति में List<T>
का खुलासा नहीं करना चाहिए, लेकिन मुझे आश्चर्य है कि ऐसा करने का उचित तरीका क्या है? उदाहरण के लिए, यह कर:उचित रूप से एक सूची का खुलासा <T>?
public static class Class1
{
private readonly static List<string> _list;
public static IEnumerable<string> List
{
get
{
return _list;
//return _list.AsEnumerable<string>(); behaves the same
}
}
static Class1()
{
_list = new List<string>();
_list.Add("One");
_list.Add("Two");
_list.Add("Three");
}
}
मेरे फोन करने वाले बस List<T>
वापस करने के लिए कास्ट करने के लिए अनुमति होगी:
private void button1_Click(object sender, EventArgs e)
{
var test = Class1.List as List<string>;
test.Add("Four"); // This really modifies Class1._list, which is bad™
}
तो अगर मैं एक बहुत अपरिवर्तनीय List<T>
चाहते मैं हमेशा एक नई सूची बनाने करना होगा? उदाहरण के लिए, यह काम करने लगता है (परीक्षण कलाकारों के बाद रिक्त है):
public static IEnumerable<string> List
{
get
{
return new ReadOnlyCollection<string>(_list);
}
}
लेकिन मैं चिंतित हूँ अगर वहाँ एक प्रदर्शन भूमि के ऊपर के रूप में मेरी सूची में हर बार जब कोई इसे उपयोग करने की कोशिश करता है क्लोन है?
क्या गलत डब्ल्यू एक संपत्ति के रूप में (टी की) एक सूची उजागर/है? – Jason
आप इसे विस्तारित नहीं कर सकते: http://blogs.msdn.com/fxcop/archive/2006/04/27/faq-why-does-donotexposegenericlists-recommend-that-i-expose-collection-lt-t-gt- इसके बजाय-सूची-lt-t-gt-david-kean.aspx –
मुझे समझ में नहीं आता कि इसका क्या मतलब है? मेरा मतलब है, मैं सिर्फ संपत्ति के रूप में संपत्ति का पर्दाफाश करूँगा ... ??? क्या यह एक थ्रेड-सुरक्षित मुद्दा है? –