जवाबों:
से docs.microsoft.com :
प्रकार या सदस्य को उसी विधानसभा या किसी अन्य विधानसभा में किसी अन्य कोड द्वारा एक्सेस किया जा सकता है जो इसे संदर्भित करता है।
प्रकार या सदस्य केवल एक ही कक्षा या संरचना में कोड द्वारा पहुँचा जा सकता है।
प्रकार या सदस्य को केवल उसी वर्ग या संरचना में या एक व्युत्पन्न वर्ग में कोड द्वारा पहुँचा जा सकता है।
private protected
(C # 7.2 में जोड़ा गया)प्रकार या सदस्य को केवल उसी वर्ग या संरचना में या उसी विधानसभा से व्युत्पन्न वर्ग में कोड द्वारा पहुँचा जा सकता है, लेकिन किसी अन्य विधानसभा से नहीं।
प्रकार या सदस्य को किसी भी विधानसभा में किसी भी कोड द्वारा पहुँचा जा सकता है, लेकिन किसी अन्य विधानसभा से नहीं।
प्रकार या सदस्य को उसी विधानसभा में किसी भी कोड या किसी अन्य विधानसभा में किसी भी व्युत्पन्न वर्ग द्वारा पहुँचा जा सकता है।
जब कोई एक्सेस संशोधक सेट नहीं किया जाता है, तो डिफ़ॉल्ट एक्सेस संशोधक का उपयोग किया जाता है। तो वहाँ हमेशा पहुँच संशोधक के कुछ फार्म है भले ही यह सेट नहीं है।
static
संशोधकएक वर्ग पर स्थिर संशोधक का मतलब है कि वर्ग को तत्काल नहीं किया जा सकता है, और इसके सभी सदस्य स्थिर हैं। एक स्थिर सदस्य का एक संस्करण होता है, भले ही इसके संलग्न प्रकार के कितने उदाहरण बनते हों।
एक स्थिर वर्ग मूल रूप से एक गैर-स्थिर वर्ग के समान होता है, लेकिन एक अंतर है: एक स्थिर वर्ग बाहरी रूप से त्वरित नहीं हो सकता है। दूसरे शब्दों में, आप वर्ग प्रकार का एक चर बनाने के लिए नए कीवर्ड का उपयोग नहीं कर सकते। कोई उदाहरण चर नहीं होने के कारण, आप स्वयं क्लास नाम का उपयोग करके किसी स्थिर वर्ग के सदस्यों तक पहुँचते हैं।
हालांकि, स्थिर कंस्ट्रक्टर के रूप में एक ऐसी चीज है । किसी भी वर्ग में इनमें से एक हो सकता है, जिसमें स्टैटिक क्लास भी शामिल हैं। उन्हें सीधे तौर पर नहीं बुलाया जा सकता है और उनके पास पैरामीटर नहीं हैं (केवल कक्षा पर किसी भी प्रकार के मापदंडों के अलावा)। पहला उदाहरण बनने से पहले या किसी भी स्थैतिक सदस्यों को संदर्भित करने से पहले क्लास को इनिशियलाइज़ करने के लिए एक स्थिर कंस्ट्रक्टर को स्वचालित रूप से कहा जाता है। इस तरह दिखता है:
static class Foo()
{
static Foo()
{
Bar = "fubar";
}
public static string Bar { get; set; }
}
स्टेटिक क्लासेस को अक्सर सेवाओं के रूप में उपयोग किया जाता है, आप उन्हें इस तरह से उपयोग कर सकते हैं:
MyStaticClass.ServiceMethod(...);
एक ग्राफिकल ओवरव्यू (संक्षेप में सारांश)
चूंकि स्थिर कक्षाएं सील की जाती हैं, उन्हें विरासत में नहीं दिया जा सकता है (ऑब्जेक्ट को छोड़कर), इसलिए संरक्षित कीवर्ड स्थिर कक्षाओं पर अमान्य है।
यदि आप कोई एक्सेस संशोधक सामने नहीं रखते हैं, तो डिफ़ॉल्ट के लिए , यहां देखें:
C # कक्षाओं और सदस्यों (फ़ील्ड्स, विधियों आदि) के लिए डिफ़ॉल्ट दृश्यता?
गैर नेस्ट
enum public
non-nested classes / structs internal
interfaces internal
delegates in namespace internal
class/struct member(s) private
delegates nested in class/struct private
नेस्ट:
nested enum public
nested interface public
nested class private
nested struct private
इसके अलावा, वे सील-कीवर्ड हैं, जो एक वर्ग को अंतर्निहित नहीं बनाता है।
इसके अलावा, VB.NET में, कीवर्ड कभी-कभी अलग होते हैं, इसलिए यहां एक धोखा-शीट है:
सार्वजनिक - यदि आप वर्ग देख सकते हैं, तो आप विधि देख सकते हैं
निजी - यदि आप कक्षा का हिस्सा हैं , तो आप विधि देख सकते हैं, अन्यथा नहीं।
संरक्षित - निजी के समान, साथ ही सभी वंशज विधि भी देख सकते हैं।
स्टेटिक (वर्ग) - "क्लास" और "ऑब्जेक्ट" के बीच अंतर को याद रखें? वह सब भूल जाओ। वे "स्थिर" के साथ समान हैं ... वर्ग स्वयं का एक-और उदाहरण है।
स्टेटिक (विधि) - जब भी आप इस विधि का उपयोग करते हैं, तो यह उस कक्षा के वास्तविक उदाहरण से स्वतंत्र संदर्भ का एक फ्रेम होगा जिसका यह हिस्सा है।
इस उत्तर से भयानक आरेखों को फिर से तैयार करना ।
वेन आरेखों में सभी एक्सेस मॉडिफ़ायर हैं, जो अधिक सीमित से अधिक उचित तक हैं:
private
:
private protected
: - C # 7.2 में जोड़ा गया
internal
:
protected
:
protected internal
:
public
:
using System;
namespace ClassLibrary1
{
public class SameAssemblyBaseClass
{
public string publicVariable = "public";
protected string protectedVariable = "protected";
protected internal string protected_InternalVariable = "protected internal";
internal string internalVariable = "internal";
private string privateVariable = "private";
public void test()
{
// OK
Console.WriteLine(privateVariable);
// OK
Console.WriteLine(publicVariable);
// OK
Console.WriteLine(protectedVariable);
// OK
Console.WriteLine(internalVariable);
// OK
Console.WriteLine(protected_InternalVariable);
}
}
public class SameAssemblyDerivedClass : SameAssemblyBaseClass
{
public void test()
{
SameAssemblyDerivedClass p = new SameAssemblyDerivedClass();
// NOT OK
// Console.WriteLine(privateVariable);
// OK
Console.WriteLine(p.publicVariable);
// OK
Console.WriteLine(p.protectedVariable);
// OK
Console.WriteLine(p.internalVariable);
// OK
Console.WriteLine(p.protected_InternalVariable);
}
}
public class SameAssemblyDifferentClass
{
public SameAssemblyDifferentClass()
{
SameAssemblyBaseClass p = new SameAssemblyBaseClass();
// OK
Console.WriteLine(p.publicVariable);
// OK
Console.WriteLine(p.internalVariable);
// NOT OK
// Console.WriteLine(privateVariable);
// Error : 'ClassLibrary1.SameAssemblyBaseClass.protectedVariable' is inaccessible due to its protection level
//Console.WriteLine(p.protectedVariable);
// OK
Console.WriteLine(p.protected_InternalVariable);
}
}
}
using System;
using ClassLibrary1;
namespace ConsoleApplication4
{
class DifferentAssemblyClass
{
public DifferentAssemblyClass()
{
SameAssemblyBaseClass p = new SameAssemblyBaseClass();
// NOT OK
// Console.WriteLine(p.privateVariable);
// NOT OK
// Console.WriteLine(p.internalVariable);
// OK
Console.WriteLine(p.publicVariable);
// Error : 'ClassLibrary1.SameAssemblyBaseClass.protectedVariable' is inaccessible due to its protection level
// Console.WriteLine(p.protectedVariable);
// Error : 'ClassLibrary1.SameAssemblyBaseClass.protected_InternalVariable' is inaccessible due to its protection level
// Console.WriteLine(p.protected_InternalVariable);
}
}
class DifferentAssemblyDerivedClass : SameAssemblyBaseClass
{
static void Main(string[] args)
{
DifferentAssemblyDerivedClass p = new DifferentAssemblyDerivedClass();
// NOT OK
// Console.WriteLine(p.privateVariable);
// NOT OK
//Console.WriteLine(p.internalVariable);
// OK
Console.WriteLine(p.publicVariable);
// OK
Console.WriteLine(p.protectedVariable);
// OK
Console.WriteLine(p.protected_InternalVariable);
SameAssemblyDerivedClass dd = new SameAssemblyDerivedClass();
dd.test();
}
}
}
Private Protected
, यह होगा: एक ही वर्ग = Yes
, एक ही विधानसभा, व्युत्पन्न वर्ग = Yes
, एक ही विधानसभा, कोई वर्ग = NO
, अलग-अलग विधानसभा, व्युत्पन्न वर्ग = NO
, अलग-अलग विधानसभा, कोई भी वर्ग = NO
। एक अतिरिक्त सुझाव यह भी होगा कि इसके लिए वर्ड ऑर्डर को स्विच न किया जाए protected internal
, क्योंकि यह @18188787 के उत्तर से न्यूमोनिक को तोड़ता है
फिर भी वर्तमान पहुंच संशोधक का एक और दृश्य दृष्टिकोण (सी # 7.2)। उम्मीद है कि स्कीमा इसे आसान याद रखने में मदद करती है
(इंटरेक्टिव दृश्य के लिए छवि पर क्लिक करें)
यदि आप दो-शब्द एक्सेस मॉडिफायर को याद करने के लिए संघर्ष करते हैं, तो बाहर-अंदर याद रखें ।
हम्म।
यहाँ देखें: पहुँच संशोधक ।
संक्षेप में:
जनता अन्य प्रकार / वर्गों से पूर्ण दृश्यता की विधि या प्रकार देती है।
निजी केवल निजी पद्धति / वैरिएबल एक्सेस के लिए निजी विधि / वैरिएबल युक्त प्रकार की अनुमति देता है (ध्यान दें कि नेस्टेड क्लासेस की भी निजी क्लासेस / वैरिएबल तक पहुँच होती है)।
संरक्षित निजी समान है सिवाय व्युत्पन्न वर्ग भी संरक्षित विधियों का उपयोग कर सकते हैं।
"कुछ नहीं" शून्य के बराबर VB.NET है। यद्यपि यदि आप "कुछ भी नहीं" का अर्थ "कोई एक्सेस संशोधक" नहीं कर रहे हैं, तो यह निर्भर करता है, हालांकि अंगूठे का एक बहुत मोटा नियम (निश्चित रूप से सी # में) यह है कि यदि आप स्पष्ट रूप से एक पहुंच संशोधक निर्दिष्ट नहीं करते हैं, तो विधि / चर घोषणा आम तौर पर प्रतिबंधित होती है क्योंकि यह हो सकती है। अर्थात
public class MyClass
{
string s = "";
}
प्रभावी रूप से समान है:
public class MyClass
{
private string s = "";
}
लिंक किए गए MSDN आलेख पूरी तरह से विवरण प्रदान करेगा जब कोई एक्सेस संशोधक स्पष्ट रूप से निर्दिष्ट नहीं है।
सार्वजनिक - कहीं भी किसी के द्वारा भी पहुँचा जा सकता है।
निजी - को केवल उसी वर्ग से प्राप्त किया जा सकता है जिसका वह हिस्सा है।
संरक्षित - केवल कक्षा या किसी भी ऑब्जेक्ट से प्राप्त किया जा सकता है जो कक्षा से विरासत में मिला है।
शून्य जैसा कुछ भी नहीं है लेकिन वीबी में।
स्टेटिक का मतलब है कि आपके पास उस ऑब्जेक्ट का एक उदाहरण है, उस वर्ग के हर उदाहरण के लिए विधि।
निजी की स्थिति इंगित करती है कि चर केवल उसी वर्ग की वस्तुओं द्वारा पहुँचा जा सकता है। संरक्षित स्थिति का उपयोग उस वर्ग के वंशजों को भी शामिल करने के लिए किया जाता है।
"उपरोक्त सारणी से हम निजी और संरक्षित के बीच के टकराव को देख सकते हैं ... मुझे लगता है कि दोनों समान हैं .... इसलिए उस दो अलग-अलग सेनाओं की क्या आवश्यकता है"
अधिक जानकारी के लिए MSDN लिंक की जाँच करें
वे एक्सेस मॉडिफ़ायर निर्दिष्ट करते हैं जहां आपके सदस्य दिखाई देते हैं। आपको शायद इसे पढ़ना चाहिए। IainMH द्वारा दिए गए लिंक को शुरुआती बिंदु के रूप में लें।
स्टैटिक सदस्य एक प्रति वर्ग हैं और एक प्रति उदाहरण नहीं।
सावधानी से अपनी कक्षाओं की अपनी पहुंच देखें। सार्वजनिक और संरक्षित कक्षाएं और विधियां डिफ़ॉल्ट रूप से सभी के लिए सुलभ हैं।
जब दृश्य स्टूडियो में नई कक्षाएं बनाई जाती हैं, तो Microsoft एक्सेस मॉडिफायर (सार्वजनिक, संरक्षित, आदि) कीवर्ड दिखाने में बहुत अधिक अन्वेषण नहीं करता है। इसलिए, अच्छी तरह से देखभाल करें और अपनी कक्षा की अपनी पहुंच के बारे में सोचें क्योंकि यह आपके कार्यान्वयन इंटर्न्स का द्वार है।
मुझे लगता है कि यह अच्छा OOP डिजाइन से संबंधित है। यदि आप एक पुस्तकालय के डेवलपर हैं तो आप अपने पुस्तकालय के आंतरिक कामकाज को छिपाना चाहते हैं। इस तरह, आप बाद में अपने पुस्तकालय के आंतरिक कामकाज को संशोधित कर सकते हैं। इसलिए आप अपने सदस्यों और सहायक विधियों को निजी के रूप में रखते हैं, और केवल इंटरफ़ेस विधियाँ सार्वजनिक हैं। जिन तरीकों को अधिलेखित किया जाना चाहिए, उन्हें संरक्षित किया जाना चाहिए।
C # में कुल 6 हैं पहुंच संशोधक हैं:
निजी : इस एक्सेसिबिलिटी के साथ घोषित सदस्य को प्रकार के भीतर दिखाई दे सकता है, यह किसी भी व्युत्पन्न प्रकार, उसी विधानसभा में अन्य प्रकार या युक्त विधानसभा के बाहर दिखाई नहीं देता है। यानी, एक्सेस केवल टाइपिंग तक ही सीमित है।
संरक्षित : इस एक्सेसिबिलिटी के साथ घोषित सदस्य को असेंबली के अंदर टाइपिंग के प्रकार से, और असेंबली से बाहर के प्रकार से व्युत्पन्न प्रकार से दिखाई दे सकता है। अर्थात्, पहुँच युक्त प्रकारों तक सीमित है।
अंदर का : इस पहुंच के साथ घोषित सदस्य इस सदस्य वाली विधानसभा के भीतर दिखाई दे सकता है, यह विधानसभा के बाहर किसी भी विधानसभा को दिखाई नहीं देता है। यानी, एक्सेस केवल असेंबली रखने तक सीमित है।
आंतरिक संरक्षित : इस पहुंच के साथ घोषित सदस्य को विधानसभा के भीतर या उसके बाहर वाले प्रकार से व्युत्पन्न प्रकारों के भीतर दिखाई दे सकता है, यह किसी भी प्रकार के विधानसभा के भीतर दिखाई देता है। अर्थात्, पहुंच विधानसभा या व्युत्पन्न प्रकारों तक सीमित है।
सार्वजनिक : इस पहुंच के साथ घोषित सदस्य इस सदस्य वाली विधानसभा के भीतर दिखाई दे सकता है, या कोई अन्य विधानसभा जिसमें विधानसभा शामिल है। यानी, पहुंच सीमित नहीं है।
C # 7.2 पहुंच का एक नया स्तर जोड़ रहा है:
निजी संरक्षित : इस पहुँच के साथ घोषित सदस्य इस प्रकार से लिया जा सकता है जिसमें इस प्रकार के विधानसभा से शामिल हैं। यह किसी भी प्रकार से नहीं दिखाई देता है जिसमें शामिल प्रकार से, या विधानसभा से बाहर नहीं है। यानी, पहुंच विधानसभा वाले प्रकारों तक सीमित है।