C # में "निजी" कीवर्ड लिखने का कोई कारण?


109

जहाँ तक मुझे पता है, C # में हर जगहprivate डिफ़ॉल्ट है (इसका मतलब है कि अगर मैं नहीं लिखता public, protectedऔर internal, आदि) यह privateडिफ़ॉल्ट रूप से होगा । (अगर मैं गलत हूं कृपया मुझे सही।)

तो, उस खोजशब्द को लिखने का क्या कारण है, या यह सदस्यों के लिए भी क्यों मौजूद है?

उदाहरण के लिए, जब कोई ईवेंट हैंडलर ऑटो-जेनरेट होता है तो यह इस तरह दिखता है:

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

लेकिन अगर यह निहित और डिफ़ॉल्ट है तो भी यह निजी क्यों लिखता है? बस इतना है कि नौसिखिए डेवलपर्स (जो नहीं जानते कि यह सी # डिफ़ॉल्ट है) जानते हैं कि यह निजी है? या कंपाइलर के लिए कोई अंतर है?

इसके अलावा, क्या कोई ऐसा मामला है जहां "निजी" (अकेले) लिखने से सदस्य की पहुंच बदल जाएगी ?


18
IIRC, एक "शीर्ष-स्तरीय" प्रकार internalडिफ़ॉल्ट रूप से हालांकि होगा।
जेफ मर्कैडो

4
सब कुछ के लिए डिफ़ॉल्ट निजी नहीं है, जैसा कि संकेत दिया गया है, और अंगूठे के सामान्य नियम के रूप में यह स्पष्ट होना बेहतर है।
जेम्स माइकल हरे


सब कुछ के लिए डिफ़ॉल्ट "जितना संभव हो उतना निजी है।" जाहिर है कि एक गैर-नेस्टेड वर्ग निजी नहीं हो सकता है, या कुछ भी तुरंत या इसका उपयोग नहीं कर सकता है। लेकिन सदस्य डिफ़ॉल्ट रूप से निजी हैं, और नेस्टेड कक्षाएं डिफ़ॉल्ट रूप से निजी हैं। C # में सब कुछ, डिफ़ॉल्ट रूप से, दृश्यता का सबसे प्रतिबंधित स्तर हो सकता है।
रयान लुंडी

जवाबों:


171

AFAIK, C # में हर जगह निजी डिफ़ॉल्ट है (इसका मतलब है कि अगर मैं सार्वजनिक, संरक्षित, आंतरिक आदि नहीं लिखता हूं, तो यह डिफ़ॉल्ट रूप से निजी होगा)। (कृपया गलत होने पर मुझे सुधारें)।

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

इसके अलावा,

तो, उस कीवर्ड को लिखने का क्या कारण है, या यह क्यों मौजूद है?

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


1
@Wayne: उनके पास जॉन स्कीट की तुलना में उच्च स्कोर के साथ एक उत्तर है, लेकिन वह इसके लायक नहीं हैं ... जॉन उत्तर बहुत अधिक सटीक है।
aleroot

2
यह व्यर्थ का भेद है। नेमस्पेस के प्रकार डिफ़ॉल्ट रूप से आंतरिक होते हैं क्योंकि वे डिफ़ॉल्ट रूप से निजी नहीं हो सकते हैं ; अन्यथा कुछ भी उनका उपयोग नहीं कर सकता था। वे अभी भी प्रतिबंधित हैं क्योंकि वे डिफ़ॉल्ट रूप से संभवत: हो सकते हैं।
रेयान लुंडी

1
आईआईएसडी कक्षाओं और संरचना के लिए डिफ़ॉल्ट सदस्यों की पहुंच निजी है। यहाँ देखें: msdn.microsoft.com/en-us/library/ba0a1yw2(v=vs.90).aspx
मिट्जा बोन्का

लेकिन एक नाम स्थान के अंदर के तत्व नहीं हो सकते private
शिम्मी वेइटहैंडलर

इसके अलावा, getऔर setसंपत्ति की पहुंच के लिए डिफ़ॉल्ट
AustinWBryan

119

AFAIK, C # में हर जगह निजी डिफ़ॉल्ट है

बिल्कुल नहीं - डिफ़ॉल्ट "इस घोषणा के लिए उपलब्ध सबसे प्रतिबंधित पहुंच" है। उदाहरण के लिए, शीर्ष-स्तरीय प्रकार के साथ डिफ़ॉल्ट है internal; एक नेस्टेड प्रकार के लिए डिफ़ॉल्ट है private

तो, उस कीवर्ड को लिखने का क्या कारण है, या यह क्यों मौजूद है?

यह स्पष्ट करता है, जो दो कारणों से अच्छा है:

  • यह उन लोगों के लिए स्पष्ट करता है जो आपके प्रश्न के अनुसार चूक को नहीं जानते हैं (मुझे यह तर्क पसंद नहीं आया है, व्यक्तिगत रूप से, लेकिन मुझे लगा कि यह ध्यान देने योग्य है)
  • यह एक धारणा देता है कि आपने जानबूझकर इसे निजी बनाने का फैसला किया है, बजाय कि चूक के साथ।

अपने अंतिम भाग के लिए:

इसके अलावा एक ऐसा मामला है जहां "निजी" (अकेले) लिखने से सदस्य की पहुंच बदल जाएगी?

हां, संपत्ति के आधे हिस्से को दूसरे की तुलना में अधिक प्रतिबंधात्मक बनाने के लिए:

// Public getter, public setter
public int Foo { get; set; }

// Public getter, private setter
public int Bar { get; private set; }

मैं हर जगह चूक के साथ जाता था, लेकिन मैं (एरिक लिपर्ट द्वारा आंशिक रूप से) आश्वस्त हूं कि यह स्पष्ट है कि आपने इसके बारे में सोचा है और कुछ निजी बनाने का फैसला किया है, यह एक अच्छा विचार है।

संभवतः भी नहीं - व्यक्तिगत तौर पर मैं क्या कर रही है कि सील के लिए / सील की गयी, भी, प्रकार घोषणाओं के लिए करने का एक तरीका वहाँ थे इच्छा है एक डिफ़ॉल्ट। मुझे संदेह है कि कई डेवलपर्स (खुद शामिल हैं अगर मैं सावधान नहीं हूं) कक्षाओं को सिर्फ इसलिए अनसेल्ड छोड़ दें क्योंकि यह उन्हें सील करने की तुलना में कम प्रयास है।


+1। शब्दार्थ इरादे को इंगित करने के लिए अन्यथा-अप्रासंगिक कीवर्ड का उपयोग करना उपयोगी है, हालांकि मेरी जावा पृष्ठभूमि finalएक अधिक विशिष्ट उदाहरण का उपयोग करती है ।
jprete

1
@ मिनिटेक: दूसरा तरीका राउंड भी काम करता है, लेकिन कम उपयोगी है। यह सब C # 2 में पेश किया गया था
जॉन स्कीट

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

+1 "एक नेस्टेड प्रकार के लिए डिफ़ॉल्ट निजी है" - जब मैं आपका जवाब पढ़ता हूं, तो मुझे इस बारे में बस पता होता है। धन्यवाद!
नॉर्डिन

5
@Phong, C # के लिए एक आसान नियम है: डिफ़ॉल्ट रूप से, सब कुछ उतना ही निजी है जितना यह हो सकता है। गैर-नेस्टेड वर्गों जैसे नाम स्थान में आइटम निजी नहीं हो सकते, क्योंकि कुछ भी उनका उपयोग नहीं कर सकता था। वे केवल आंतरिक या सार्वजनिक हो सकते हैं; इसलिए डिफ़ॉल्ट रूप से, वे आंतरिक हैं। अन्य चीजों के अंदर की चीजें (एक वर्ग के भीतर की बातें; नेस्टेड वर्ग; गुण; क्षेत्र; विधियां ...) डिफ़ॉल्ट रूप से निजी हैं।
रयान ल्यूडी

11

privateदृश्य अव्यवस्था जोड़ता है। जो लोग जोर देकर कहते हैं कि इससे चीजें स्पष्ट होती हैं, मैं पूछता हूं: क्या आप गणित के साथ भी ऐसा करते हैं? उदाहरण के लिए:

var answer = a + b / c;

क्या आपको लगता है कि चारों ओर निरर्थक कोष्ठक के बिना अस्पष्ट है b / c?

C # में नियम बहुत सरल है: डिफ़ॉल्ट रूप से, सब कुछ निजी के जितना करीब हो सकता है। इसलिए यदि आपको डिफॉल्ट की तुलना में कुछ अधिक दिखने की आवश्यकता है , तो एक संशोधक जोड़ें। अन्यथा, अपने कोड में अनावश्यक कीवर्ड न जोड़ें।


1
मैं सवाल पूछने से पहले इस अधिकार से सहमत था। लेकिन, कुछ लोग VB, कुछ C ++, कुछ भी F # लिखते हैं (अन्य कार्यात्मक भाषाओं जैसे Haskell शायद?) से बेहतर, वे C # पर करते हैं। इसलिए, उनके लिए (और हमारे लिए अगर हम इसके बारे में भूल जाते हैं 2 साल के बाद बिना c # ing) यह बेहतर है अगर एक्सेसर्स स्पष्ट हैं। प्रभाव सीखना आसान नहीं है एक परियोजना पर प्रभाव है, कई डेवलपर्स पृष्ठभूमि से आते हैं जो पसंद के उपकरण को प्रतिबिंबित नहीं कर सकते हैं, और उन्हें सीखने की सहायता की जरूरत है, यहां तक ​​कि उत्पादन कोड में, यह बिल्कुल भी बुरा नहीं है (और हम कई जानते हैं कोड बहुत खराब C #, इसलिए कुछ एड्स हमारी भी मदद करते हैं)।
कैमिलो मार्टिन

3
ठीक है, निश्चित रूप से, VB में चूक अतिक्रमण कर रहे हैं। मुझे लगता है कि डिफ़ॉल्ट दृश्यता Friendसदस्यों के लिए है, उदाहरण के लिए। C # इसकी दृश्यता को सही तरीके से परिभाषित नहीं करता है: जब तक वे बदले नहीं जाते तब तक चीजें कम से कम दृश्यता के लिए निर्धारित होती हैं। मैं जो ढूंढने में सक्षम हूं, यह वही प्रतीत होता है जो C ++ (स्ट्रक्चर्स को छोड़कर) के लिए सही है। (यह F # के लिए सही प्रतीत नहीं होता है।)
रयान लुंडी

6
यह मेरे लिए अजीब है कि इतने सारे लोग इसके पक्ष में हैं var, क्योंकि यह दृश्य अव्यवस्था में कटौती करता है, और अभी तक बहुत से लोग व्यर्थ टाइपिंग के पक्ष में हैं private
रयान लुंडी

2
मैं तो यहाँ तक कहूंगा कि दृश्य अव्यवस्था पठनीयता को बाधित करती है!
बिंकी

1
भले ही मैं आपके गणित उदाहरण के मामले में कोष्ठक का उपयोग करना पसंद करूँ
मार्क.2377

7

जहाँ तक मुझे पता है, C # में हर जगह निजी डिफ़ॉल्ट है

स्पष्ट रूप से निजी घोषित करने का मतलब है कि आप जानते हैं कि यह निजी है। केवल यह मत सोचो कि यह है, क्योंकि जहाँ तक तुम जानते हो, यह डिफ़ॉल्ट है। इसका मतलब यह भी है कि कोड को देखने वाला कोई और व्यक्ति जानता है कि यह क्या है।

कोई "मुझे नहीं लगता कि यह है", "मुझे पूरा यकीन है कि यह है", आदि यह बस है । और हर कोई एक ही पेज पर है।

मैं C # डेवलपर नहीं हूं । अगर मुझे कुछ कोड के साथ काम करना था, जिसे स्पष्ट रूप से निजी घोषित नहीं किया गया था , तो मैं शायद यह मानूंगा कि यह आंतरिक था ।

जब चीजें निहित होती हैं तो मैं नापसंद करता हूं। यह कभी स्पष्ट नहीं होता है जब वे स्पष्ट रूप से सेट होते हैं।


उचित लगता है, मैं उन भाषाओं की मूल बातें भी भूल जाता हूं जिन्हें मैं एक बार बेहतर जानता था।
कैमिलो मार्टिन

6

पठनीयता - हर कोई नहीं जानता कि निजी डिफ़ॉल्ट व्यवहार है।

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


5

पठनीयता, इरादे का प्रदर्शन दो महान कारण हैं जिनके बारे में मैं सोच सकता हूं।


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

3

दृश्यता को स्पष्ट रूप से निर्दिष्ट करने का एक अच्छा कारण यह है कि आपको यह सोचने की ज़रूरत नहीं है कि आप जिस संदर्भ में हैं उसके लिए डिफ़ॉल्ट क्या है।

एक और अच्छा कारण है क्योंकि एफएक्सकोप आपको ऐसा करने के लिए कहता है।


+1, मैंने अभी-अभी FxCop के बारे में शिकायत की थी कि जब मैंने बदलाव के साथ निजी मॉडिफायर को हटाने की शिकायत की थी।
कैमिलो मार्टिन

2

बहुत सारे लोग (मेरे जैसे लोग!) नियमित रूप से मुट्ठी भर विभिन्न भाषाओं में कार्यक्रम करते हैं। इस तरह की चीजों के साथ स्पष्ट होना मुझे उन सभी भाषाओं के सभी पुरातन विवरणों को याद रखने की आवश्यकता से रोकता है जिनमें मैं कार्यक्रम करता हूं।


1
वैसे मैं यह नहीं कहूंगा कि "डिफॉल्ट एक्सेस मॉडिफायर private" एक आर्कन डिटेल है ... लेकिन मुझे बात समझ में आ रही है। दूसरे दिन मुझे यह याद रखने में परेशानी हुई कि पिछले हफ्ते ( MEF ) में मैंने किस तरह का फ्रेमवर्क इस्तेमाल किया था।
कैमिलो मार्टिन

0

मैं बाकी कक्षा के दायरे की पठनीयता के साथ सामंजस्य के लिए कहूंगा।


4
आप C ++ की सोच रहे हैं। C # में, यहां तक ​​कि संरचना में, सदस्य निजी रूप से डिफ़ॉल्ट होते हैं।

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