कक्षाओं, विधियों, सदस्यों, निर्माणकर्ताओं, प्रतिनिधियों और इंटरफेस के लिए डिफ़ॉल्ट एक्सेस संशोधक क्या है?
कक्षाओं, विधियों, सदस्यों, निर्माणकर्ताओं, प्रतिनिधियों और इंटरफेस के लिए डिफ़ॉल्ट एक्सेस संशोधक क्या है?
जवाबों:
C # में सब कुछ के लिए डिफ़ॉल्ट पहुंच "उस सदस्य के लिए घोषित सबसे अधिक प्रतिबंधित पहुंच है" ।
उदाहरण के लिए:
namespace MyCompany
{
class Outer
{
void Foo() {}
class Inner {}
}
}
के बराबर है
namespace MyCompany
{
internal class Outer
{
private void Foo() {}
private class Inner {}
}
}
इसके अपवाद का एक प्रकार संपत्ति के एक हिस्से (आमतौर पर सेटर) को स्वयं संपत्ति की घोषित पहुंच से अधिक प्रतिबंधित कर रहा है:
public string Name
{
get { ... }
private set { ... } // This isn't the default, have to do it explicitly
}
यह C # 3.0 विनिर्देशन को कहना है (खंड 3.5.1):
उस संदर्भ पर निर्भर करता है जिसमें कोई सदस्य घोषणा करता है, केवल कुछ प्रकार की घोषित पहुंच की अनुमति होती है। इसके अलावा, जब कोई सदस्य घोषणा में कोई एक्सेस संशोधक शामिल नहीं करता है, तो जिस संदर्भ में घोषणा होती है वह डिफ़ॉल्ट घोषित पहुंच को निर्धारित करता है।
- नाममात्र के सार्वजनिक रूप से पहुंच की घोषणा की गई है। नेमस्पेस घोषणाओं पर किसी भी एक्सेस संशोधक की अनुमति नहीं है।
- संकलन इकाइयों या नेमस्पेस में घोषित प्रकारों में सार्वजनिक या आंतरिक घोषित पहुंच और डिफ़ॉल्ट से आंतरिक घोषित पहुंच हो सकती है।
- कक्षा के सदस्यों की घोषित अभिगम्यता के पाँच प्रकारों में से कोई भी हो सकता है और निजी घोषित पहुँच के लिए डिफ़ॉल्ट हो सकता है। (ध्यान दें कि एक वर्ग के एक सदस्य के रूप में घोषित एक प्रकार की घोषित पहुँच के पाँच प्रकार हो सकते हैं, जबकि एक प्रकार के नाम के सदस्य के रूप में घोषित केवल सार्वजनिक या आंतरिक घोषित पहुँच हो सकती है।)
- संरचना सदस्यों के पास सार्वजनिक, आंतरिक, या निजी घोषित पहुंच और निजी घोषित पहुंच के लिए डिफ़ॉल्ट हो सकता है क्योंकि संरचना को स्पष्ट रूप से सील कर दिया जाता है। एक संरचना में पेश किए गए संरचना सदस्य (जो कि उस संरचना से विरासत में नहीं मिले हैं) ने आंतरिक घोषित पहुंच को संरक्षित या संरक्षित नहीं किया है। (ध्यान दें कि किसी संरचना के सदस्य के रूप में घोषित किए गए प्रकार में सार्वजनिक, आंतरिक या निजी घोषित पहुंच हो सकती है, जबकि किसी नामस्थान के सदस्य के रूप में घोषित किए गए प्रकार में केवल सार्वजनिक या आंतरिक घोषित पहुंच हो सकती है।)
- इंटरफ़ेस के सदस्यों को स्पष्ट रूप से सार्वजनिक घोषित सुलभता है। इंटरफ़ेस सदस्य घोषणाओं पर किसी भी एक्सेस संशोधक की अनुमति नहीं है।
- गणन सदस्यों ने स्पष्ट रूप से सार्वजनिक रूप से अभिगम्यता की घोषणा की है। गणना सदस्य घोषणाओं पर किसी भी एक्सेस संशोधक की अनुमति नहीं है।
(ध्यान दें कि नेस्टेड प्रकार "क्लास मेंबर" या "स्ट्रक्चर मेंबर्स" पार्ट्स के अंतर्गत आते हैं - और इसलिए प्राइवेट डिफॉल्टर्स के लिए डिफ़ॉल्ट है।)
top level class: internal
method: private
members (unless an interface or enum): private (including nested classes)
members (of interface or enum): public
constructor: private (note that if no constructor is explicitly defined, a public default constructor will be automatically defined)
delegate: internal
interface: internal
explicitly implemented interface member: public!
class Foo : IFoo { IFoo.M() {} } ... Foo a = new Foo();
, यदि आप इसके M
साथ नहीं पहुँच सकते हैं a.M()
, हालाँकि आप इसके साथ पहुँच सकते हैं (a as IFoo).M()
। (बारीकियों पर अधिक जानकारी के लिए कल्पना की जाँच करें)
संक्षिप्त उत्तर: न्यूनतम संभव पहुँच (cf जॉन स्कीट का उत्तर)।
लंबा जवाब:
गैर-नेस्टेड प्रकार, गणना और प्रतिनिधि पहुंच ( केवल आंतरिक या सार्वजनिक पहुंच हो सकती है )
| Default | Permitted declared accessibilities ------------------------------------------------------------------ namespace | public | none (always implicitly public) enum | public | none (always implicitly public) interface | internal | public, internal class | internal | public, internal struct | internal | public, internal delegate | internal | public, internal
नेस्टेड प्रकार और सदस्य पहुंच
| Default | Permitted declared accessibilities ------------------------------------------------------------------ namespace | public | none (always implicitly public) enum | public | none (always implicitly public) interface | public | none class | private | All¹ struct | private | public, internal, private² delegate | private | All¹ constructor | private | All¹ interface member | public | none (always implicitly public) method | private | All¹ field | private | All¹ user-defined operator| none | public (must be declared public)
¹ सभी === सार्वजनिक, संरक्षित, आंतरिक, निजी, संरक्षित आंतरिक
² स्ट्रक्चर्स स्ट्रक्चर्स या क्लासेस (हालाँकि वे इंटरफेस कर सकते हैं) से इनहेरिट नहीं कर सकते हैं, इसलिए संरक्षित करना एक मान्य संशोधक नहीं है
एक नेस्टेड प्रकार की पहुंच उसके पहुंच क्षेत्र पर निर्भर करती है, जो सदस्य की घोषित पहुंच और तुरंत युक्त प्रकार के एक्सेसिबिलिटी डोमेन दोनों द्वारा निर्धारित की जाती है। हालाँकि, एक नेस्टेड प्रकार की पहुँच डोमेन युक्त प्रकार से अधिक नहीं हो सकती।
नोट: CIL में संरक्षित और आंतरिक (मौजूदा संरक्षित के विपरीत "या" आंतरिक) के लिए भी प्रावधान है , लेकिन मेरी जानकारी के अनुसार यह वर्तमान में C # में उपयोग के लिए उपलब्ध नहीं है।
देख:
http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
http://msdn.microsoft.com/en-us/library/ms173121.aspx
http://msdn.microsoft.com/en हमें / पुस्तकालय / cx03xt0t.aspx
(मैं Microsoft URI से प्यार करता हूँ ...)
एक्सेस संशोधक पर एक नज़र डालें (C # प्रोग्रामिंग गाइड)
कक्षा और संरचना पहुंच
कक्षाएं और संरचनाएं जो सीधे एक नाम स्थान के भीतर घोषित की जाती हैं (दूसरे शब्दों में, जो अन्य वर्गों या संरचनाओं के भीतर निहित नहीं हैं) या तो सार्वजनिक या आंतरिक हो सकती हैं। यदि कोई पहुँच संशोधक निर्दिष्ट नहीं है, तो आंतरिक डिफ़ॉल्ट है।
नेस्टेड वर्गों और संरचनाओं सहित संरचना सदस्यों को सार्वजनिक, आंतरिक या निजी के रूप में घोषित किया जा सकता है। वर्ग के सदस्य, जिनमें नेस्टेड वर्ग और संरचना शामिल हैं, सार्वजनिक, संरक्षित आंतरिक, संरक्षित, आंतरिक, निजी संरक्षित या निजी हो सकते हैं। वर्ग के सदस्यों और संरचना सदस्यों के लिए पहुँच स्तर, जिनमें नेस्टेड वर्ग और संरचना शामिल हैं, डिफ़ॉल्ट रूप से निजी है। निजी नेस्टेड प्रकार युक्त प्रकार के बाहर से सुलभ नहीं हैं।
व्युत्पन्न वर्गों के पास अपने आधार प्रकारों की तुलना में अधिक पहुंच नहीं हो सकती है। दूसरे शब्दों में, आपके पास एक सार्वजनिक वर्ग B नहीं हो सकता है जो एक आंतरिक वर्ग ए से प्राप्त होता है। यदि इसे अनुमति दी गई थी, तो इसका प्रभाव A सार्वजनिक करने पर होगा, क्योंकि A के सभी संरक्षित या आंतरिक सदस्य व्युत्पन्न वर्ग से सुलभ हैं।
आप का उपयोग करके अपने आंतरिक प्रकार तक पहुँचने के लिए विशिष्ट अन्य विधानसभाओं को सक्षम कर सकते हैं
InternalsVisibleToAttribute
। अधिक जानकारी के लिए, मित्र विधानसभाएं देखें।कक्षा और संरचना सदस्य पहुंच
कक्षा के सदस्यों (नेस्टेड वर्गों और संरचनाओं सहित) को छह प्रकार की पहुंच में से किसी के साथ घोषित किया जा सकता है। संरचना सदस्यों को संरक्षित घोषित नहीं किया जा सकता है क्योंकि संरचना विरासत का समर्थन नहीं करती है।
आम तौर पर, किसी सदस्य की पहुंच उस प्रकार की पहुंच से अधिक नहीं होती है, जिसमें यह शामिल होता है। हालाँकि, आंतरिक वर्ग का कोई सार्वजनिक सदस्य असेंबली के बाहर से पहुँच योग्य हो सकता है यदि सदस्य इंटरफ़ेस विधियों को लागू करता है या सार्वजनिक आधार वर्ग में परिभाषित वर्चुअल विधियों को ओवरराइड करता है।
किसी भी सदस्य का प्रकार जो एक क्षेत्र, संपत्ति या घटना है, कम से कम सदस्य के रूप में सुलभ होना चाहिए। इसी तरह, वापसी का प्रकार और किसी भी सदस्य का पैरामीटर प्रकार जो एक विधि, अनुक्रमणिका या प्रतिनिधि है, कम से कम सदस्य के रूप में सुलभ होना चाहिए। उदाहरण के लिए, आपके पास एक सार्वजनिक तरीका नहीं हो सकता है M जो C को एक वर्ग C को भी सार्वजनिक करता है। इसी तरह, यदि आपके पास A को निजी घोषित किया जाता है, तो आपके पास A की संरक्षित संपत्ति नहीं हो सकती है।
उपयोगकर्ता-परिभाषित ऑपरेटरों को हमेशा सार्वजनिक और स्थिर घोषित किया जाना चाहिए। अधिक जानकारी के लिए, ऑपरेटर ओवरलोडिंग देखें।
फ़ाइनलिज़र में एक्सेसिबिलिटी संशोधक नहीं हो सकते हैं।
अन्य प्रकार
सीधे एक नेमस्पेस के भीतर घोषित किए गए इंटरफेस को सार्वजनिक या आंतरिक के रूप में घोषित किया जा सकता है और, कक्षाओं और संरचनाओं की तरह, आंतरिक पहुंच के लिए डिफ़ॉल्ट रूप से इंटरफेस। इंटरफ़ेस सदस्य हमेशा सार्वजनिक होते हैं क्योंकि एक इंटरफ़ेस का उद्देश्य अन्य प्रकारों को एक वर्ग या संरचना तक पहुंचने में सक्षम करना है। इंटरफ़ेस सदस्यों के लिए कोई एक्सेस संशोधक लागू नहीं किया जा सकता है।
गणन सदस्य हमेशा सार्वजनिक होते हैं, और कोई एक्सेस संशोधक लागू नहीं किया जा सकता है।
प्रतिनिधि वर्ग और संरचना की तरह व्यवहार करते हैं। डिफ़ॉल्ट रूप से, उनके पास आंतरिक पहुंच तब होती है जब किसी नेमस्पेस में सीधे घोषित किया जाता है, और नेस्टेड होने पर निजी एक्सेस।
कक्षा डिफ़ॉल्ट रूप से आंतरिक है।
डिफ़ॉल्ट रूप से इंटरफ़ेस आंतरिक है।
इंटरफ़ेस सदस्य डिफ़ॉल्ट रूप से सार्वजनिक होते हैं । (इंटरफेस हमारे सदस्यों के लिए किसी भी प्रकार की पहुंच निर्दिष्ट करने की अनुमति नहीं देगा।)
नोट: यदि आप इंटरफ़ेस के सदस्यों के लिए किसी भी एक्सेस स्पेसियर को निर्दिष्ट करने का प्रयास करते हैं, तो यह संकलन त्रुटि दिखाता है।
डिफ़ॉल्ट रूप से संरचना आंतरिक है।
मैं कुछ दस्तावेज़ीकरण लिंक जोड़ना चाहूंगा। अधिक विस्तार से यहां देखें ।
सबसे सरल उत्तर निम्नलिखित है .....
C # में सभी सदस्य हमेशा डिफ़ॉल्ट रूप से LEAST सुलभ संशोधक लेते हैं।
यही कारण है कि एक विधानसभा में सभी शीर्ष स्तर की कक्षाएं डिफ़ॉल्ट रूप से "आंतरिक" होती हैं, जिसका अर्थ है कि वे उस विधानसभा के लिए सार्वजनिक हैं, जो निजी हैं या बाहरी विधानसभाओं तक पहुंच से बाहर रखा गया है। शीर्ष स्तर के वर्ग के लिए एकमात्र अन्य विकल्प सार्वजनिक है जो अधिक सुलभ है। नेस्टेड प्रकारों के लिए अपने सभी निजी को छोड़कर कुछ दुर्लभ अपवादों जैसे कि एनम और इंटरफेस के सदस्य जो केवल सार्वजनिक हो सकते हैं। कुछ उदाहरण। शीर्ष स्तर की कक्षाओं और इंटरफेस के मामले में, चूक हैं:
आंतरिक श्रेणी के पशु के समान ही पशु
इंटरफ़ेस एनिमल पब्लिक इंटरफ़ेस एनिमल के समान
नेस्टेड वर्गों और इंटरफेस (प्रकार के अंदर) के मामले में, चूक हैं:
निजी श्रेणी के पशु के समान
इंटरफ़ेस पशु निजी इंटरफ़ेस पशु के समान है
यदि आप केवल यह मान लेते हैं कि डिफ़ॉल्ट हमेशा सबसे निजी है, तो आपको तब तक एक्सेसर्स का उपयोग करने की आवश्यकता नहीं है जब तक आपको डिफ़ॉल्ट को बदलने की आवश्यकता नहीं है। आसान।