indexer स्पष्ट साथ लागू किया गया है इंटरफेस कार्यान्वयन, ताकि आप केवल इसे उपयोग करने में सक्षम हो जाएगा अगर आप कार्य करें:
IList<int> b = new ReadOnlyCollection<int>(new[] { 2, 4, 2, 2 });
b[2] = 3;
या
var b = new ReadOnlyCollection<int>(new[] { 2, 4, 2, 2 });
((IList<int>)b)[2] = 3;
बेशक
, यह तो निष्पादन समय असफल होगा ...
यह पूरी तरह से जानबूझकर और उपयोगी है - इसका मतलब है कि यह एक ReadOnlyCollection
, कार्यक्षमता के असमर्थित बिट्स उपलब्ध नहीं हैं जब संकलक जानता है आप के लिए, निष्पादन समय विफलता से दूर करने में मदद करने के लिए।
हालांकि यह एक दिलचस्प और अपेक्षाकृत असामान्य कदम है, प्रभावी रूप से संपत्ति/सूचकांक का आधा हिस्सा स्पष्ट रूप से कार्यान्वित करता है, और एक आधा स्पष्ट रूप से।
मेरे पिछले विचारों के विपरीत, मेरा मानना है कि ReadOnlyCollection<T>
वास्तव में स्पष्ट रूप से पूरे इंडेक्सर को लागू करता है, लेकिन भी एक सार्वजनिक केवल पढ़ने के लिए इंडेक्सर प्रदान करता है।
public T Item[int index] { get; }
T IList<T>.Item[int index] { get; set; }
आप डाली हैं:
T IList<T>.this[int index]
{
// Delegate interface implementation to "normal" implementation
get { return this[index]; }
set { throw new NotSupportedException("Collection is read-only."); }
}
public T this[int index]
{
get { return ...; }
}
स्रोत
2009-09-11 09:15:58
ठीक है, लेकिन मैं स्पष्ट कार्यान्वयन का उपयोग कर ReadOnlyCollection की कार्यक्षमता दोहराता हूं। मैं नहीं देखता कि आप इंटरफ़ेस से विधि या संपत्ति को कैसे हटा सकते हैं। –
@EsbenP: आप इंटरफ़ेस से कोई विधि नहीं हटा सकते हैं ... लेकिन आप इसे केवल तभी उपलब्ध कर सकते हैं जब संदर्भ का स्थिर प्रकार इंटरफ़ेस को लागू करने वाले वर्ग के बजाय इंटरफ़ेस है। –
ठीक है, अगर मैं दो indexers, उन्हें IList को लागू करने की एक स्पष्ट रूप से यह काम करता है टी IList .इस [पूर्णांक सूचकांक] {{ वापसी स्रोत [सूचकांक] प्राप्त होता है; } सेट { नया नोट लागू नहीं किया गया अपवाद(); } } सार्वजनिक टी यह [पूर्णांक सूचकांक] {{ वापसी स्रोत [सूचकांक] प्राप्त होता है; } } –