2009-07-02 11 views
8

मैं एक सरणी रैपर क्लास लिख रहा हूं जो IList<T> लागू करता है। मुझे यकीन है कि IList<T>.IsReadOnly (ICollection<T> से विरासत में मिला) के लिए वापस लौटना है।आईसीलेक्शन <T> का अनुबंध IsReadOnly

मेरी कक्षा सम्मिलन और निष्कासन को अस्वीकार करती है। यह this[int].set संपत्ति के माध्यम से आइटम को संशोधित करने की अनुमति देता है।

MSDN कहा गया है कि

एक संग्रह है कि केवल पढ़ने के लिए इसके अलावा, हटाने, या तत्वों के संशोधन की अनुमति नहीं है के बाद संग्रह बनाई गई है। जहाँ तक मैं देख सकते हैं, इस विधि का उपयोग किया जाता है के रूप में इस प्रकार है:

मेरी कक्षा के लिए, यह मतलब है मैं true वापस जाने के लिए है, लेकिन मेरी आँखों में इस संपत्ति के एक बिट पूरी तरह से बेकार बना देता है कि लगता है :

ग्राहक मनमाने ढंग से IList को संभालते हैं और पर किसी तत्व को सम्मिलित करने की आवश्यकता है, यदि संभव हो तो। वे इसे Insert पर कॉल करके और परिणामी NotSupportedException को पकड़कर कर सकते हैं - और विभिन्न कारणों से, यह वांछनीय नहीं हो सकता है। तो अपवाद को उत्तेजित करने के बजाय, ग्राहक पहले से ही IsReadOnly संपत्ति का परीक्षण कर सकते हैं।

लेकिन क्योंकि यह उसकी सामग्री की परिवर्तनीयता के साथ संग्रह की परिवर्तनीयता घुलमिल इस संपत्ति का परिणाम गलत होगा - जो पूरी तरह से असंबंधित मामलों कर रहे हैं!

यह सुनिश्चित हो, वहाँ IList.IsFixedSize संपत्ति (विस्तार नहीं IList<T> करता IList) है, लेकिन यह एक अलग प्रकार है। मुझे क्या करना चाहिए? IList भी लागू करें (मैं वास्तव में इस विकल्प की तरह नहीं है)? कुछ और करो?

+1

केवल कुछ जोड़ने के लिए, ReadOnlyCollection सामग्री को संशोधित किया जा सकता है (यदि म्यूटेबल हो) और फिर भी, "IsReadOnly" संपत्ति सत्य लौटती है ... –

+0

@bruno - यह निर्भर करता है कि "संपादन सामग्री" का मतलब है कि आप बदल रहे हैं ** बदलना ** किसी दिए गए स्थान पर आइटम (सूची [एन] = आइटम), और ** किसी दिए गए स्थान पर आइटम को म्यूटेट करना (सूची [एन] .SomeProp = मान)। –

उत्तर

2

विचार करने के लिए कुछ और ...

आपका संग्रह एक सरणी आवरण है और यह कुछ सरणी की तरह अर्थ विज्ञान है। यानी, वस्तुओं को सम्मिलित या हटाया नहीं जा सकता है लेकिन उन्हें संशोधित किया जा सकता है।

सरणी IsReadOnly और trueIsFixedSize के लिए के लिए false लौट आते हैं।

मुझे लगता है कि मैं शायद IList<T> के अलावा IList लागू करेगा और उसके बाद सरणी व्यवहार की नकल, अब तक IsReadOnly के रूप में और IsFixedSize चिंतित हैं।

एक संग्रह है कि केवल पढ़ने के लिए इसके अलावा, हटाने, या तत्वों के संशोधन के बाद संग्रह बनाई गई है अनुमति नहीं देता:

remark from MSDN में कुंजी शब्द "या" है।

आपका संग्रह तो IsReadOnly के लिए true कि अनुबंध तोड़ने की जाएगी मेरी राय में, लौटने संशोधन की अनुमति देने, करता है।

+0

महत्वपूर्ण: यदि आप सार्वजनिक 'IsReadOnly' संपत्ति' पर कॉल करते हैं तो एक सरणी 'झूठी' वापस आती है। यह सार्वजनिक संपत्ति *** गैर-जेनेरिक *** इंटरफ़ेस 'IList' पर 'IList.IsReadOnly' का कार्यान्वयन भी है। यदि सरणी एक "वेक्टर" है, यानी यह एक-आयामी है और "सामान्य" सरणी जैसे इंडेक्स 0 से शुरू होता है, सरणी सामान्य इंटरफ़ेस 'IList <>' लागू करता है। फिर जेनेरिक इंटरफ़ेस 'IList <>' को 'ICollection <>' से 'IsReadOnly' प्राप्त होता है। यह 'आईसीओलेक्शन <>। IsReadOnly' एक प्रकार का "जादुई" स्पष्ट इंटरफ़ेस कार्यान्वयन के साथ कार्यान्वित किया गया है। यह कार्यान्वयन सच हो जाता है! –

+1

एक उदाहरण: 'int [] arr = {2, 4, 6,}; बूल एक्स = arr.IsReadOnly;/* झूठी */बूल वाई = ((IList ) arr) IsReadOnly; /* सच! */'तो अगर पूछताछ एक सरणी की तरह व्यवहार करना चाहता है, तो उसे _generic_ इंटरफ़ेस के कार्यान्वयन के लिए 'सत्य' वापस करना चाहिए। –

2

मुझे लगता है कि परिभाषित अनुबंध को पूरा करने के लिए, आपको true वापस करना होगा।

आप (अतिरिक्त) IBindingList को लागू कर सकते हैं - इस AllowNew, AllowEdit और AllowRemove है। आप से true और अन्य दो से false वापस कर देंगे।

चाहे आपके कॉलर की जांच इस पर कॉलर तक हो, भले ही। हालांकि, यूआई बाध्यकारी कोड का बहुत कुछ होगा।

कहा:

इसके अलावा, आप को IList लागू करना चाहिए यदि आप IList<T> लागू कर रहे हैं; विशेष रूप से, IList कई प्रतिबिंब और बाध्यकारी परिदृश्यों के लिए महत्वपूर्ण है, जहां प्रकार समय से पहले ज्ञात नहीं हैं।

+0

धन्यवाद - मैं (एक बार फिर) पूरी तरह बाध्यकारी के बारे में भूल गया (मैं इसे अक्सर उपयोग नहीं करता)। मैं आपकी सलाह का पालन करूंगा। –

1

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

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