नेमस्पेस- C # /। NET में केवल कक्षा दृश्यता?


87

C # में, क्या आप एक वर्ग को अलग विधानसभा में रहने के बिना केवल अपने स्वयं के नामस्थान के भीतर दिखाई दे सकते हैं? यह विशिष्ट सहायक वर्गों के लिए उपयोगी लगता है जिनका उपयोग कहीं और नहीं किया जाना चाहिए। (यानी जावा पैकेज-प्राइवेट क्लासेस को क्या कहता है)


मैं आपके प्रश्न को नहीं समझता। मैंने अपने उत्तर हटा दिए क्योंकि आपका मतलब "आंतरिक" नहीं था?
— Zyphrax

3
@ एनोस: क्या आप जावा के पैकेज-स्तरीय दृश्यता के बराबर देख रहे हैं?
— जॉन सॉन्डर्स

जवाबों:



80

आप कक्षाएं बना सकते हैं internalलेकिन यह केवल विधानसभा के बाहर किसी को भी कक्षा का उपयोग करने से रोकता है । लेकिन आपको अभी भी प्रत्येक नामस्थान के लिए एक अलग असेंबली बनानी होगी, जिसके साथ आप यह करना चाहते हैं। मैं मान रहा हूं कि आप ऐसा क्यों नहीं करना चाहते हैं।

N # नाम बदलने की क्षमता को लागू करने के लिए सी # कंपाइलर प्राप्त करना

यहां एक लेख है ( C # में Namespace दृश्यता ) जो "नकली नाम स्थान" के रूप में आंशिक कक्षाओं का उपयोग करने की एक विधि दिखाता है जो आपको सहायक हो सकता है।

लेखक बताता है कि यह पूरी तरह से काम नहीं करता है और वह कमियों पर चर्चा करता है। मुख्य समस्या यह है कि C # डिजाइनरों ने C # को इस तरह से काम नहीं करने के लिए डिज़ाइन किया है । यह C # /। NET में अपेक्षित कोडिंग प्रथाओं से भारी विचलन करता है, जो .NET फ्रेमवर्क के सबसे बड़े लाभों में से एक है।

यह एक साफ-सुथरी चाल है ... अब यह मत करो।


1
बस एक उदाहरण मिला:System.Net.Mime.MediaTypeNames.Application
— Bitterblue

लेख कहता है कि आपको अपने "नाम स्थान" नाम के साथ हर कॉल को उपसर्ग करना होगा, लेकिन आपको सी # 6 "स्थिर" के साथ की आवश्यकता नहीं है। आप "नेमस्पेस" को एक स्थिर आंशिक वर्ग बना सकते हैं और फिर क्लाइंट कोड में "स्टेटिक का उपयोग करते हुए" लिख सकते हैं
— पुमको

@Pumkko 'स्टेटिक' स्टेटमेंट का उपयोग करने में सक्षम होने के लिए क्लास को स्टैटिक होने की आवश्यकता नहीं है, हालाँकि यदि आप इसे नेमस्पेस के रूप में उपयोग कर रहे हैं तो यह वैसे भी होना चाहिए।
— फजी लॉजिक

21

आंतरिक असेंबली (कड़ाई से बोलने वाला मॉड्यूल) गोपनीयता है। नामस्थान दृश्यता पर इसका कोई प्रभाव नहीं है।

एक ही विधानसभा के भीतर अन्य वर्गों से एक वर्ग की गोपनीयता प्राप्त करने का एकमात्र तरीका एक वर्ग के लिए एक आंतरिक वर्ग होना है।

इस बिंदु पर यदि वर्ग निजी है तो यह उस वर्ग या बाहरी वर्ग के लिए कुछ भी अदृश्य नहीं है।

यदि संरक्षित है तो यह सभी को दिखाई देता है जो निजी होने पर भी देख सकता है लेकिन बाहरी वर्ग के उप वर्गों को भी दिखाई देता है।

public class Outer
{
    private class Hidden     { public Hidden() {} }
    protected class Shady    { public Shady() {} }
    public class Promiscuous { public Promiscuous() {} }
}

public class Sub : Outer
{
    public Sub():base() 
    {
        var h = new Hidden();      // illegal, will not compile
        var s = new Shady();       // legal
        var p = new Promiscuous(); // legal
    }
}

public class Outsider 
{
    public Outsider() 
    {
        var h = new Outer.Hidden();      // illegal, will not compile
        var s = new Outer.Shady()        // illegal, will not compile
        var p = new Outer.Promiscuous(); // legal
    }
}

संक्षेप में, जो आप चाहते हैं उसे प्राप्त करने का एकमात्र तरीका बाहरी वर्ग को नामस्थान के रूप में उपयोग करना और उस वर्ग के भीतर प्रतिबंधित करना है।


@ शुग्गीकोउक: सार्वजनिक वर्ग उप: बाहरी को सार्वजनिक वर्ग सील किया जाना चाहिए उप: बाहरी ??? +1 हालांकि ... यह मेरे लिए काम करता है
— आईएब्रेट

0

यदि आपके पास एक एकल असेंबली है, तो आप उस असेंबली में जितने चाहें उतने नामस्थान परिभाषित कर सकते हैं, लेकिन कोई फर्क नहीं पड़ता कि आप आईडीई में क्या संशोधक लागू करते हैं, आप हमेशा अन्य नामस्थानों में कक्षाएं देख पाएंगे।


0

यकीन नहीं होता कि यह सीधे संभव है, लेकिन नकली होने के कुछ अच्छे तरीके होंगे:

1) जिन वर्गों को इस प्रकार के सामान की आवश्यकता होती है, उन्हें एकल वर्ग से विरासत में मिलता है, जिसमें एक आंतरिक वर्ग के रूप में सहायक वर्ग होता है।

2) विस्तार विधियों का उपयोग करें और फिर केवल नामस्थान के भीतर विस्तार विधियों का संदर्भ लें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.