2013-05-11 6 views
11

मैं एक public निर्माता के साथ कुछ सी # कोड है कि एक internal संशोधक के साथ एक वर्ग वाणी देखा है, क्या करता है:एक आंतरिक वर्ग पर एक सार्वजनिक निर्माता मतलब

internal class SomeClass 
{ 
    public SomeClass() 
    { 
    } 
} 

क्या एक सार्वजनिक निर्माता होने की बात है , अगर पूरी कक्षा की दृश्यता आंतरिक है, तो इसे केवल परिभाषित असेंबली के अंदर ही देखा जा सकता है?

इसके अलावा, क्या यह के मामले में कोई समझ में आता है कुछ क्लास एक नेस्टेड क्लास है?

+2

यदि आप एक आंतरिक कन्स्ट्रक्टर के साथ एक आंतरिक उपयोगकर्ता नियंत्रण बनाते हैं, तो विन फॉर्म डिजाइनर गलत व्यवहार करेगा। – DaveShaw

+1

क्लास पर "मास्टर स्विच" के रूप में एक्सेस संशोधक के बारे में सोचें जो सभी वर्ग के सदस्यों की * अधिकतम * पहुंच को सेट करता है। –

+0

@ChrisMcGrath। बड़े पैमाने पर मैं सहमत हूं, हालांकि यह प्रश्न कक्षाओं के घोंसले के बारे में भी पूछता है (और मैंने इसे अपने पहले पढ़ने पर याद किया, इसलिए मैंने इसे अपने उत्तर में एक संपादन में संबोधित किया है)। –

उत्तर

14

internal class गुंजाइश public MyClass() निर्माता गुंजाइश, ओवरराइड करता है निर्माता internal बना रही है।

कन्स्ट्रक्टर पर public का उपयोग कर कक्षा को public पर अपडेट करना आसान बनाता है, लेकिन इरादे को भ्रमित करता है। मैं यह नहीं करता

संपादित करें 3: मुझे आपके प्रश्न का हिस्सा याद आया। यह अभी भी ठीक है कि अगर आपकी कक्षा घोंसला है। घोंसले में कोई फर्क नहीं पड़ता है, भले ही यह किसी सार्वजनिक वर्ग में एक निजी वर्ग में घिरा हुआ हो ... (C# language specification - 3.5.2 Accessibility domains देखें)।

संपादित करें: और, अगर मैं याद करते हैं, अगर ctor internal है, यह नहीं एक सामान्य प्रकार जहां एक बाधा where T : new() की आवश्यकता होती है वहाँ के रूप में इस्तेमाल किया जा सकता है, यह एक public निर्माता की आवश्यकता होगी (। रेफरी C# language specification (version 4.0) - 4.4.3 Bound and unbound types) ।

संपादित करें 2: कोड का नमूना ऊपर

class Program 
{ 
    internal class InternalClass { 
     internal InternalClass() { } 
    } 
    internal class InternalClassPublicCtor { 
     public InternalClassPublicCtor() { }   
    } 
    internal class GenericClass<T> 
     where T : new() {} 

    static void Main(string[] args) { 
     GenericClass<InternalClass> doesNotCompile = new GenericClass<InternalClass>(); 
     GenericClass<InternalClassPublicCtor> doesCompile = new GenericClass<InternalClassPublicCtor>(); 
    } 
} 
+0

मैं भ्रमित इरादे पर एक ही दिमाग में हूं जब तक कि आपके पास बहुत सारे रचनाकार नहीं हैं, अपडेट के बाद अपने रचनाकारों को सार्वजनिक रूप से बदलना मुश्किल नहीं होना चाहिए और कई रिफैक्टरिंग टूल भी इसका सुझाव देंगे –

0

आंतरिक कीवर्ड प्रकार और प्रकार के सदस्यों के लिए एक एक्सेस संशोधक है। आंतरिक सदस्य केवल उसी असेंबली में फ़ाइलों के भीतर पहुंच योग्य हैं।

उदाहरण: Microsoft internal modifier

+0

लेकिन सवाल यह नहीं पूछा कि आंतरिक संशोधक क्या करता है ...? –

6

MSDN - Access Modifiers (C# Programming Guide) से प्रदर्शन:

आम तौर पर, एक सदस्य की पहुंच प्रकार जिसमें यह है की पहुंच से बड़ा नहीं है। हालांकि, यदि आंतरिक सदस्य इंटरफ़ेस विधियों को लागू करता है या सार्वजनिक आधार वर्ग में परिभाषित वर्चुअल विधियों को ओवरराइड करता है तो आंतरिक वर्ग का एक सार्वजनिक सदस्य असेंबली के बाहर से पहुंच योग्य हो सकता है।

तो यदि उदाहरण के लिए, आपके पास सार्वजनिक इंटरफ़ेस का आंतरिक कार्यान्वयन है, तो भी आप कुछ सदस्यों को सार्वजनिक रूप से बेनकाब कर सकते हैं।

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

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