2009-04-13 18 views
12

यहक्यों HashSet <T> .IsReadOnly स्पष्ट है?

var h = new HashSet<int>(); 
var r = h.IsReadOnly; 

संकलन नहीं है। मुझे

var r = ((ICollection<int>)h).IsReadOnly; 

क्यों नहीं किया गया था सामान्य रूप से सामान्य रूप से लागू किया गया था?

(मैं कैसे नहीं पूछ रहा हूँ, लेकिन क्यों)

उत्तर

16

मेरा अनुमान है कि इसकी वजह से, जबकि HashSet लागू करता ICollection, IsReadOnly HashSet के लिए कोई मतलब नहीं है। वास्तव में, यदि आप इसे प्रतिबिंबित करते हैं, तो संपत्ति हमेशा झूठी होती है। इसे लागू करने से सार्वजनिक विधि से इस विधि को स्पष्ट रूप से छुपाया जाता है।

एक और कारण है, क्योंकि ICollection इंटरफ़ेस (, उदा XAML क्रमबद्धता का समर्थन करने के), क्योंकि आकस्मिक कारण से लागू किया जा सकता बल्कि इसलिए कि वर्ग का प्राथमिक उपयोग करने के लिए अपनी आवश्यकता से। तो इसे स्पष्ट रूप से कार्यान्वित करना कक्षा के इंटरफ़ेस से अव्यवस्था को रोक सकता है।

+0

आह, हाँ, कुछ मतलब होता है। हैशसेट भी इसी कारण से IRead को छुपाता है, इसलिए यदि आप इसका उपयोग करने का प्रयास करते हैं तो संकलन त्रुटि। –

+0

BTW, आप XAML क्रमबद्धता के लिए ICollection को लागू करने की जरूरत नहीं है, संग्रहों को IDictionary या IList लागू करना होगा। यह अवसरों का एक उदाहरण था जब आपको आकस्मिक कारणों से इंटरफ़ेस को लागू करने की आवश्यकता हो सकती है। – Will

5

मूल रूप से दो कारणों से आप एक स्पष्ट इंटरफेस कार्यान्वयन (: MSDN स्रोत): का सहारा होता हैं

  1. आप एक ही हस्ताक्षर युक्त सदस्यों के साथ कई इंटरफेस को लागू है, और आप इन सदस्यों अलग ढंग से व्यवहार करना चाहते हैं।
  2. एक इंटरफेस सदस्य वर्ग के लिए विशेष रुचि का नहीं है, लेकिन आदेश इंटरफ़ेस द्वारा वस्तुओं को संदर्भित करने के लिए आवश्यक है।

HashSet<T> के लिए, बाद के मामले पर लागू होता है, के रूप में एक हैश सेट केवल कभी नहीं पढ़ा जाता है और इस प्रकार IsReadOnly हमेशा false वापस आ जाएगी।