2011-08-09 10 views
14

मैं अभिगम्यता पर शुरुआती सत्र के लिए कुछ डेमो कोड स्थापित कर रहा हूं और मैंने पाया कि मैं व्युत्पन्न कक्षा से आंतरिक संरक्षित संपत्ति तक पहुंचने में सक्षम हूं। मैं क्या खो रहा हूँ?आंतरिक संरक्षित संपत्ति अभी भी एक अलग असेंबली से सुलभ है

विधानसभा 1

namespace Accessibility 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ExampleClass c = new ExampleClass(); 
      c.Go(); 
      //c.Prop1 = 10; 
     } 
    } 

    class ExampleClass : DerivedClass 
    { 
     public void Go() 
     { 
      this.Prop1 = 10; 
      this.Prop2 = 10; 
      //this.Prop3 = 10; //Doesn't work 
      //this.Prop4 = 10; //Doesn't work 
      this.Prop5 = 10; //why does this work?! 

      this.DoSomething(); 
     } 
    } 
} 

विधानसभा 2

namespace Accessibility.Models 
{ 
    public class BaseClass 
    { 
     public int Prop1 { get; set; } 
     protected int Prop2 { get; set; } 
     private int Prop3 { get; set; } 

     internal int Prop4 { get; set; } 
     internal protected int Prop5 { get; set; } 
     //internal public int Prop6 { get; set; } //Invalid 
     //internal private int Prop7 { get; set; } //Invalid 

     public BaseClass() 
     { 
      this.Prop3 = 27; 
     } 
    } 

    public class DerivedClass : BaseClass 
    { 
     public void DoSomething() 
     { 
      this.Prop1 = 10; 
      this.Prop2 = 10; 
      //this.Prop3 = 10; //Doesn't work 
      this.Prop4 = 10; 
      this.Prop5 = 10; 

      PropertyInfo Prop3pi = typeof(DerivedClass).GetProperty("Prop3", BindingFlags.Instance | BindingFlags.NonPublic); 
      int value = (int)Prop3pi.GetValue(this, null); 
     } 
    } 
} 

सूचना ExampleClass.Go में मैं Prop5 के लिए एक मूल्य निर्धारित कर सकते हैं। क्यूं कर? इसे आंतरिक संरक्षित के रूप में चिह्नित किया गया है लेकिन मैं प्रोप 4 (आंतरिक के रूप में चिह्नित) पर एक मूल्य निर्धारित नहीं कर सकता

+16

क्योंकि यह * आंतरिक * या * संरक्षित * है। नहीं और। –

+1

-1: जाहिर है, एक साधारण Google खोज ने इस प्रश्न का उत्तर दिया होगा ... –

+1

मुझे नहीं लगता था कि यह या तो –

उत्तर

20

internal protected का अर्थ है "असेंबली के लिए आंतरिक या विरासत वर्ग"। तो हाँ, यदि आप एक संरक्षित आंतरिक सदस्य के साथ एक सार्वजनिक वर्ग, अन्य वर्ग है कि एक अलग विधानसभा में उस प्रकार इनहेरिट है अभी भी यह संरक्षित आपरिवर्तक की वजह से पहुँच सकते हैं:

संरक्षित आंतरिक

प्रकार या सदस्य को असेंबली में किसी भी कोड द्वारा एक्सेस किया जा सकता है जिसमें इसे घोषित किया जाता है, या किसी अन्य असेंबली में व्युत्पन्न कक्षा के भीतर से।किसी अन्य असेंबली से पहुंच कक्षा की घोषणा के भीतर होनी चाहिए जो कक्षा से प्राप्त होता है जिसमें संरक्षित आंतरिक तत्व घोषित किया जाता है, और यह व्युत्पन्न वर्ग प्रकार के उदाहरण के माध्यम से होना चाहिए।

संदर्भ: http://msdn.microsoft.com/en-us/library/ms173121.aspx

यह सी # भाषा की एक सीमा है। सीएलआर "आंतरिक और संरक्षित" धारणा का समर्थन करता है। MethodAttributes.FamANDAssem गणना के साथ इसका सबूत है यदि आप अपना खुद का आईएल उत्सर्जित कर रहे थे। यदि आप वास्तव में इस सुविधा को चाहते हैं, तो आप कुछ आईएल पोस्ट प्रोसेसिंग जैसे मोनो.सीसिल के साथ कर सकते हैं। सी # भाषा का पर्दाफाश क्यों नहीं करता है यह केवल एक अनुमान है: इसके लिए कम आवश्यकता है।

6

क्योंकि यह internal protected काम करने का इरादा है। विरासत पेड़ (protected भाग) में या किसी भी असेंबली (internal भाग) के लिए या तो बच्चों के लिए पहुंच दी जाती है - Access Modifiers on MSDN देखें।

और आपके ExampleClassBaseClass के विरासत पेड़ में है, जो Prop5 को परिभाषित करता है। तो पहुंच protected भाग के लिए धन्यवाद है।

+0

मुझे सरल स्पष्टीकरण पसंद है। –

4

संरक्षित और आंतरिक कीवर्ड के संयोजन से, एक वर्ग सदस्य को संरक्षित आंतरिक चिह्नित किया जा सकता है - केवल उसी व्युत्पन्न के भीतर व्युत्पन्न प्रकार या प्रकार उस सदस्य तक पहुंच सकते हैं।

This MSDN article अपने सभी सवालों के जवाब दें।

+0

तो यह या तो सबसे सीमित कीवर्ड तक सीमित है या नहीं? –

+0

यह सही है। संरक्षित आंतरिक माध्यम से व्युत्पन्न प्रकार (संरक्षित) और असेंबली (आंतरिक) दोनों इसका उपयोग कर सकते हैं। यह केवल आंतरिक संशोधक पर लागू होता है। आप दूसरों को गठबंधन नहीं कर सकते हैं। –

3

संरक्षित कीवर्ड एक सदस्य पहुंच संशोधक है। एक संरक्षित सदस्य उस वर्ग के भीतर से पहुंच योग्य है जिसमें इसे घोषित किया गया है, और इस सदस्य को घोषित करने वाले वर्ग से प्राप्त किसी भी वर्ग के भीतर से। एक ही विधानसभा के भीतर ही व्युत्पन्न प्रकार या प्रकार है कि सदस्य का उपयोग कर सकते -

http://msdn.microsoft.com/en-us/library/bcd5672a(v=vs.71).aspx

संरक्षित और आंतरिक कीवर्ड के संयोजन से, एक वर्ग के सदस्य के रूप में चिह्नित आंतरिक संरक्षित किया जा सकता।

http://msdn.microsoft.com/en-us/library/ms173121(v=vs.80).aspx

2

Protected मतलब है कि यह केवल वंशज वर्गों के साथ साझा किया जाता है, केवल private मतलब है कि यह किसी और के द्वारा पहुँचा नहीं जा सकता।

संपादित करें: हंस टिप्पणी आपके प्रश्न को थोड़ा और स्पष्ट बनाती है। जब आप इस तरह के संशोधक गठबंधन करते हैं, तो वे विशेष रूप से विशेष रूप से गठबंधन नहीं करते हैं। यह internal या protected सभी तरीकों से पहुंच सकता है।

4

असल में, ऐसा लगता है कि ऐसा नहीं लगता है।

देखें - http://msdn.microsoft.com/en-us/library/ba0a1yw2(VS.80).aspx

एक या के रूप में संरक्षित आंतरिक कार्य करता है - पहुँच व्युत्पन्न वर्ग के लिए या वर्तमान विधानसभा के लिए प्रतिबंधित है।

0

देर उत्तर लेकिन मैं एक ही मुद्दे से पकड़ा गया। आखिरकार मैं आंशिक समाधान के साथ आया था।

internal Int MyInt 
    { 
     get; 
     protected set; 
    } 

यह अभी भी असेंबली के भीतर दिखाई देता है लेकिन कम से कम केवल विरासत कक्षाएं इसे वास्तविक रूप से बदल सकती हैं। यह जो मैं चाहता था उसके लिए पर्याप्त है।

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