'संरक्षित' और 'संरक्षित आंतरिक' के बीच अंतर क्या है?


244

क्या कोई मुझे 'संरक्षित' और 'संरक्षित आंतरिक' संशोधक के बीच अंतर को विस्तृत कर सकता है? ऐसा लगता है कि वे एक ही तरीके से व्यवहार करते हैं।

जवाबों:


402

"संरक्षित आंतरिक" एक्सेस संशोधक "संरक्षित" और "आंतरिक" संशोधक दोनों का एक संघ है।

से MSDN, पहुँच संशोधक (सी # प्रोग्रामिंग गाइड) :

संरक्षित :

प्रकार या सदस्य को केवल उसी वर्ग या संरचना में कोड द्वारा या उस वर्ग से ली गई कक्षा में पहुँचा जा सकता है।

आंतरिक :

प्रकार या सदस्य को किसी भी विधानसभा में किसी भी कोड द्वारा पहुँचा जा सकता है, लेकिन किसी अन्य विधानसभा से नहीं।

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

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

ध्यान दें : का protected internalअर्थ है " protectedया internal" (किसी भी विधानसभा में कोई वर्ग, या किसी भी व्युत्पन्न वर्ग - भले ही वह अलग विधानसभा में हो)।

... और पूर्णता के लिए:

निजी :

प्रकार या सदस्य को केवल उसी कक्षा या संरचना में कोड द्वारा एक्सेस किया जा सकता है।

जनता :

प्रकार या सदस्य को उसी विधानसभा या किसी अन्य विधानसभा में किसी अन्य कोड द्वारा एक्सेस किया जा सकता है जो इसे संदर्भित करता है।

निजी संरक्षित :

पहुंच वर्तमान विधानसभा के भीतर युक्त वर्ग से व्युत्पन्न वर्ग या प्रकार तक सीमित है।
( C # 7.2 के बाद से उपलब्ध )


2
क्या मेरा कोई सदस्य protected internalहो सकता है इसलिए यह protectedवर्तमान विधानसभा में है और बाहरी रूप से पूरी तरह से अनुपलब्ध है?
शिम्मी वेइटहैंडलर

8
यह "संरक्षित" होगा, यह नहीं होगा?
सीएडी

2
@ शमी: आपके पास संरक्षित विधियों के साथ एक आंतरिक वर्ग हो सकता है । लेकिन तब बाहरी असेंबली से पूरी कक्षा अनुपलब्ध होगी।
M4N

1
@ शमी इस प्रस्ताव को सी # github.com/dotnet/roslyn/blob/features/pStreetProtected/docs/… के
नैट कुक

@ शमी कम से कम सीएलआर संरक्षित और आंतरिक पहुंच के प्रतिच्छेदन की अवधारणा का समर्थन करता है, लेकिन C # भाषा नहीं करता है। C # दो एक्सेस मॉडिफायर के केवल संघ का समर्थन करता है।
RBT

89

protected किसी भी विधानसभा से किसी भी उपवर्ग द्वारा इस्तेमाल किया जा सकता है।

protected internalवह सब कुछ protectedहै, साथ ही एक ही विधानसभा में कुछ भी इसे एक्सेस कर सकता है।

महत्वपूर्ण रूप से, इसका अर्थ "एक ही विधानसभा में उप-वर्ग" नहीं है - यह दो का मिलन है, न कि प्रतिच्छेदन।


3
पाठकों के लिए बस एक FYI करें जो CLR संरक्षित और आंतरिक पहुंच के प्रतिच्छेदन की अवधारणा का समर्थन करता है, लेकिन C # इसका समर्थन नहीं करता है। C # इस पोस्ट में उल्लिखित दोनों के केवल मिलन का समर्थन करता है।
RBT

1
पाठकों के लिए बस एक और FYI, "एक ही असेंबली में उपवर्ग" private protectedएक्सेस मॉडिफायर के साथ प्राप्त किया जा सकता है जो C # 7.2 में पेश किया गया था
लॉर्डविल्मोर

52

- अपडेट उत्तर २०१ ९ -

आप नीचे दी गई तालिका आधारित पहुंच में अंतर पा सकते हैं हां,

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


4
सुंदर जवाब, यह बहुत स्पष्ट रूप से प्रत्येक एक्सेस संशोधक के बीच के अंतर को बताता है।
e_i_pi

23

व्यवहार में, विधियों के बारे में:

संरक्षित - विरासत में मिली कक्षाओं के लिए सुलभ, अन्यथा निजी।

आंतरिक - केवल विधानसभा के अंदर की कक्षाओं के लिए सार्वजनिक, अन्यथा निजी।

संरक्षित आंतरिक - का अर्थ है संरक्षित या आंतरिक - विधि विरासत में मिली वर्गों और विधानसभा के अंदर किसी भी वर्ग के लिए सुलभ हो जाती है ।


1
मैं OR का उपयोग उस कारण को व्यक्त करने के लिए करूंगा जो या तो ऐसा नहीं है जो सच हो।
ब्रायन रासमुसेन

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

वहाँ एक रास्ता के रूप में एक सदस्य को चिह्नित करने के है protectedऔर internal?
शिम्मी वेइटहैंडलर

@Shimmy: हाँ, protected internal
abatishchev

1
@ शमी दो साल बाद, और हाँ। अब C # 7.2 में एक तरीका है। इसका नाम private protected डॉक्स.माइकोमिक्स.com
पॉलि Paulsterø

10

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

सार्वजनिक वास्तव में विधानसभा के अंदर और बाहर सार्वजनिक है ( सार्वजनिक आंतरिक / सार्वजनिक बाहरी )

संरक्षित वास्तव में विधानसभा के अंदर और बाहर संरक्षित है ( संरक्षित आंतरिक / संरक्षित बाहरी ) (शीर्ष स्तर की कक्षाओं पर अनुमति नहीं है)

निजी वास्तव में विधानसभा के अंदर और बाहर निजी है ( निजी आंतरिक / निजी बाहरी ) (शीर्ष स्तर की कक्षाओं पर अनुमति नहीं है)

आंतरिक वास्तव में विधानसभा के अंदर सार्वजनिक है लेकिन विधानसभा के बाहर की तरह निजी ( सार्वजनिक आंतरिक / बाहरी बाहरी )

संरक्षित आंतरिक वास्तव में विधानसभा के अंदर सार्वजनिक है लेकिन विधानसभा के बाहर संरक्षित है ( सार्वजनिक आंतरिक / संरक्षित बाहरी ) (शीर्ष स्तर की कक्षाओं पर अनुमति नहीं है)

जैसा कि आप देख सकते हैं कि संरक्षित आंतरिक एक बहुत ही अजीब जानवर है। सहज नहीं है।

अब यह सवाल उठता है कि Microsoft ने एक ( संरक्षित आंतरिक / बहिष्कृत बाहरी ) क्यों नहीं बनाया , या मुझे लगता है कि किसी तरह का "निजी संरक्षित" या "आंतरिक संरक्षित" है? जबरदस्त हंसी। अधूरा लगता है?

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

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

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


1
निजी संरक्षित अब C # 7.2 में जोड़ा गया है जो मूल रूप से आंतरिक और संरक्षित है।
पौली Paulsterø

7

संरक्षित : चर या विधि केवल बाल वर्गों (किसी भी विधानसभा में) के लिए उपलब्ध होगी

संरक्षित आंतरिक : किसी भी असेंबली में और एक ही असेंबली के भीतर सभी कक्षाओं के लिए बाल कक्षाएं उपलब्ध हैं


3

मैंने इन शर्तों के लिए बहुत स्पष्ट परिभाषाएँ पढ़ी हैं।

संरक्षित: प्रवेश कक्षा की परिभाषा और वर्ग से विरासत में मिली किसी भी कक्षा तक सीमित है। प्रकार या सदस्य को केवल उसी वर्ग या संरचना में या उस वर्ग से ली गई कक्षा में पहुँचा जा सकता है।

आंतरिक: प्रवेश विशेष रूप से वर्तमान परियोजना विधानसभा के भीतर परिभाषित वर्गों तक सीमित है। प्रकार या सदस्य को केवल उसी कक्षा में कोड द्वारा एक्सेस किया जा सकता है।

संरक्षित-आंतरिक: प्रवेश वर्तमान विधानसभा या वर्ग युक्त से व्युत्पन्न प्रकारों तक सीमित है।


1

संरक्षित सदस्य

किसी वर्ग में संरक्षित वर्ग में केवल उपलब्ध वर्ग में (जिसमें वह घोषित किया गया है) और विधानसभा के भीतर और विधानसभा के बाहर भी।

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

हम विधानसभा के बाहर संरक्षित सदस्य को उस वर्ग से विरासत में मिला सकते हैं और उसका उपयोग केवल व्युत्पन्न वर्ग में कर सकते हैं।

नोट: व्युत्पन्न वर्ग में ऑब्जेक्ट का उपयोग करके संरक्षित सदस्य सुलभ नहीं हैं।

आंतरिक सदस्य

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

नोट: आंतरिक सदस्य असेंबली के बाहर या तो ऑब्जेक्ट बनाने या एक व्युत्पन्न वर्ग का उपयोग करके सुलभ नहीं होते हैं।

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

संरक्षित आंतरिक पहुंच संशोधक संयोजन संरक्षित या आंतरिक है।

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

नोट: संरक्षित आंतरिक सदस्य एक ही विधानसभा के भीतर आंतरिक के रूप में काम करता है और विधानसभा के बाहर के लिए संरक्षित के रूप में काम करता है।


1

सार्वजनिक - सार्वजनिक रूप से घोषित सदस्यों (कार्य और चर) को कहीं से भी एक्सेस किया जा सकता है।

निजी - निजी सदस्यों को कक्षा के बाहर से प्रवेश नहीं दिया जा सकता है। यह एक सदस्य के लिए डिफ़ॉल्ट एक्सेस स्पेसियर है, अर्थात यदि आप किसी सदस्य (चर या फ़ंक्शन) के लिए एक्सेस स्पेसियर निर्दिष्ट नहीं करते हैं, तो इसे निजी माना जाएगा। इसलिए, स्ट्रिंग PhoneNumber; निजी स्ट्रिंग PhoneNumber के बराबर है।

संरक्षित - संरक्षित सदस्यों को केवल बाल वर्गों से ही एक्सेस किया जा सकता है।

आंतरिक - यह केवल एक ही विधानसभा के भीतर पहुँचा जा सकता है।

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


0

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

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