नियोजित "निजी संरक्षित" सी # एक्सेस संशोधक का क्या अर्थ है?


133

GitHub पर रोसलिन प्रलेखन के हिस्से के रूप में , C # और VB के लिए नियोजित भाषा सुविधाओं के साथ भाषा सुविधा कार्यान्वयन स्थिति नामक एक पृष्ठ है ।

एक फ़ीचर जिसे मैं अपने सिर के चारों ओर लपेट नहीं सकता था, वह private protectedपहुँच संशोधक था :

private protected string GetId() {  } 

C # भाषा डिज़ाइन नोट्स का एक पृष्ठ भी है , जो कई नई विशेषताओं की व्याख्या करता है, लेकिन यह एक नहीं है।

एरिक लिपर्ट ने एक टिप्पणी में कहा :

आपकी त्रुटि संशोधक के रूप में बढ़ती प्रतिबंधों की सोच में है। वास्तव में संशोधक हमेशा प्रतिबंधों को कम करते हैं। याद रखें, चीजें डिफ़ॉल्ट रूप से "निजी" हैं; केवल संशोधक जोड़कर आप उन्हें कम प्रतिबंधित करते हैं।

का अर्थ क्या है private protected? मैं इसका उपयोग कब कर सकता हूं?


2
ध्यान दें कि वीबी भाषा डिजाइन नोटों के तहत इसके बारे में जानकारी है ।
जेसी गुड

3
यह MethodAttributes.FamANDAssem के लिए एक मानचित्रण है। C # में आंतरिक की एक अजीब मानचित्रण है , यह (निजी | FamandAssem) का उपयोग करता है। और (निजी | परिवार) के लिए आंतरिक संरक्षित नक्शे। सीएलआर विशेषताएँ अजीब हैं।
हंस पासेंट

22
यह प्रस्तावित सुविधा मेरी टिप्पणी को गलत बना देगी।
एरिक लिपर्ट

C # डिज़ाइन टीम ने इस सुविधा के लिए सुझाए गए वैकल्पिक वाक्यविन्यास के साथ एक सर्वेक्षण प्रकाशित किया है । इनमें से कुछ दिलचस्प हैं, जैसे protected & internal, assembly protectedया proternal(मुझे उम्मीद है कि इनमें से कुछ चुटकुले हैं)। कुछ अच्छे अंतर्दृष्टि के साथ चर्चा धागा भी है ।
कोबी

1
फ़ीचर को अब भाषा फ़ीचर कार्यान्वयन स्थिति में वापस ले लिया गया है! व्यक्तिगत रूप से मुझे इस पहुंच स्तर का विचार पसंद है और मुझे लगता है कि यह एक उपयोगी विशेषता है। मैं अपने कोड को वर्ग डिज़ाइन के अनुसार रखने के लिए संरक्षित का उपयोग करना चाहता हूं, लेकिन मैं नहीं चाहता कि अन्य लोग भी इस तरह के सदस्य तक पहुँच प्राप्त करें। IMO सबसे अच्छा समाधान होगा यदि हम लिख सकते हैं protected | internalऔरprotected & internal
फेलिक्स कील

जवाबों:


98

डी बिल इवजेन और जे ग्लिनन द्वारा " प्रोफेशनल सी # 2008 " के अनुसार, पृष्ठ 1699:

निजी संरक्षित - "वर्तमान विधानसभा के भीतर केवल व्युत्पन्न प्रकार"

C ++ / CLI में एक समान विशेषता है - वर्गों और संरचनाओं को परिभाषित और उपभोग करें (C ++ / CLI)> सदस्य दृश्यता :

private protected-या- protected private- सदस्य विधानसभा के अंदर सुरक्षित है लेकिन विधानसभा के बाहर निजी है।


72
तो यह "संरक्षित या आंतरिक" के बजाय "संरक्षित और आंतरिक" है?
user541686

2
क्या अब ऐसा सदस्य होना संभव होगा जो internalविधानसभा में सब कुछ उजागर होने के लिए सदस्य की आवश्यकता के बिना व्युत्पन्न वर्गों को स्वीकार करने या प्रकार की चीजों को वापस करने के लिए सुलभ हो ?
15

धन्यवाद! मैंने उसके बारे में नहीं सोचा। मेरे पास वास्तव में ऐसे मामले हैं जो मैंने उस संशोधक का उपयोग किया होगा, और वापस गिर गया internal
कोबी

3
इस प्रस्ताव / सुविधा के अस्तित्व से प्रतीत होता है कि internalदृश्यता (जहां वर्ग परिभाषित है) से संबंधित वास्तव में ऑर्थोगोनल टू public/ protected/ privateविजिबिलिटी (विरासत से संबंधित) है और संभवत: internalइसका अपना संशोधक public/ protected/ से अलग होना चाहिए private
jpmc26

1
@jww - मैं जावा से बहुत परिचित नहीं हूं, लेकिन जैसा कि मैं जानता हूं कि packageजावा सी # में नाम स्थान की तरह है।
गोगुत्ज

187

यहां वेन आरेखों में सभी एक्सेस मॉडिफ़ायर हैं, जो अधिक सीमित से अधिक उचित तक हैं:

private:
यहाँ छवि विवरण दर्ज करें

private protected: - C # 7.2 में जोड़ा गया
यहाँ छवि विवरण दर्ज करें

internal:
यहाँ छवि विवरण दर्ज करें

protected:
यहाँ छवि विवरण दर्ज करें

protected internal:
यहाँ छवि विवरण दर्ज करें

public:
यहाँ छवि विवरण दर्ज करें


3
स्रोत छवि: मॉडिफायर्स एक्सेस करेंपीडीडीएन मैंने aptly को Paint.Net नाम दिया है
कोबी

9
ये आकृतियाँ मेरे सारे (C #) जीवन कहाँ रही हैं? वे उत्कृष्ट हैं - धन्यवाद!
जॉन पीटरसन

28

यह बस विभिन्न पहुँच स्तरों के लिए एक ग्राफ ( http://ashitani.jp/gv/ के साथ बनाया ) प्रदान करना है (चित्र टिप्पणियों में फिट नहीं हैं)।

सी # एक्सेस स्तरों के डिग्राफ आरेख

प्रत्येक तीर का अर्थ है "से अधिक प्रतिबंधात्मक"।

CLR नाम हैं Private, FamilyANDAssembly, Assembly, Family, FamilyORAssembly, Public


बहुत बाद में संपादित करें: यह अच्छा नया एक्सेस स्तर निकला (वास्तव में खराब नाम के साथ) अंततः C # 6.0 में शामिल नहीं था । यह केवल C # 7.2 से समर्थित है (और मुझे लगता है कि आपने अपना प्रश्न "टैग" अपडेट किया है)।


यह सिर्फ मैं हो सकता है, लेकिन तीर 'कम से कम प्रतिबंधात्मक' दिशा में जा रहे हैं।
एक्रेलॉन

4
@acarlon हाँ, इसलिए a → bआरेख में इसका अर्थ है " aसे अधिक प्रतिबंधात्मक b", इसलिए आप "तीर को" के रूप में "अधिक से अधिक प्रतिबंधात्मक" पढ़ सकते हैं (जो कि मैंने समझाने की कोशिश की थी), इसलिए तीर कम से कम प्रतिबंधात्मक है " दिशा"। तीर के लिए विपरीत सम्मेलन वैसे ही अच्छा हो सकता था, लेकिन मुझे एक सम्मेलन चुनना था।
जेपी स्टिग नीलसन

10

यह सिर्फ एक अनुमान है, लेकिन एक नाम से आप संभवतः अनुमान लगा सकते हैं कि यह protected(या privateयदि आप चाहें तो) का अधिक प्रतिबंधित संस्करण है । और इसका केवल उचित संस्करण ही सीमित हैprotected व्यवहार को विधानसभा ।

संभावित उपयोग: फिर आप protectedआंतरिक कार्यान्वयन के लिए चाहते हैं , लेकिन बाहरी उपयोग के लिए नहीं (और आप कक्षा को सील नहीं करना चाहते हैं)।

PS यह हमेशा CLR में मौजूद था , लेकिन C # में नहीं । यह का एक संयोजन है protected और internal , बोली:

सीएलआर भी "परिवार और विधानसभा" पहुंच प्रकार का समर्थन करता है। इसका मतलब यह है कि विधि घोषित प्रकार, नेस्टेड और व्युत्पन्न प्रकारों के भीतर से सुलभ है, लेकिन केवल अगर वे एक ही विधानसभा में घोषित किए जाते हैं। खैर, जाहिरा तौर पर C # टीम ने इसे एक बहुत ही उपयोगी विशेषता के रूप में नहीं सोचा था इसलिए यह इस भाषा में समर्थित नहीं है।


CLR टिप्पणी के लिए +1 - मैं इन दिनों C # में इतना समय बिताता हूं और इन दिनों दूसरी .NET भाषाओं में इतना कम खर्च करता हूं कि कभी-कभी भूल जाता हूं कि वे एक ही चीज नहीं हैं।
ब्रिचंस

@DarrelHoffman ध्यान देने के लिए धन्यवाद! मैंने अपने विचारों को यहाँ थोड़ा सा मिलाया)
पेट्र अब्दुलिन

5

"हो सकता है" केवल एक ही विधानसभा में उपवर्गों को दिखाई दे। इससे यह थोड़ा प्रतिबंधित है protected


1

"निजी संरक्षित" सुविधा के लिए युक्ति देखें :

निजी संरक्षित का सहज अर्थ है "इस वर्ग के भीतर पहुँच से युक्त वर्ग से व्युत्पन्न"।

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