2008-09-26 11 views
22

क्लास सदस्यों के लिए "निजी" डिफ़ॉल्ट पहुंच संशोधक को ध्यान में रखते हुए, कीवर्ड को भी क्यों आवश्यक है?"निजी" संशोधक क्या करता है?

+12

रिडंडेंसी रिडंडेंसी विभाग द्वारा आपको लाया गया! –

+0

@ किवी: आपके संपादन के बारे में - यह कक्षाओं के लिए भी डिफ़ॉल्ट है, न केवल वर्ग के सदस्यों, सही? –

+0

@ ब्रैड: उत्कृष्ट हास्य आदमी। –

उत्तर

28

यह आपके लिए (और भावी रखरखाव) है, संकलक नहीं।

15

स्पष्टता। मैं कभी भी डिफ़ॉल्ट का उपयोग नहीं करता और हमेशा संशोधक को स्पष्ट रूप से जोड़ता हूं।

यह मेरी जावा पृष्ठभूमि की वजह से हो सकता है जहां डिफ़ॉल्ट 'पैकेज' था (लगभग सी # में 'आंतरिक' के बराबर) और इसलिए अंतर हमेशा मुझे परेशान करता था। मुझे बेहतर होने के लिए स्पष्टता मिली।

मैं भी अब जो स्पष्ट किया जा रहा करने के लिए डिफ़ॉल्ट, तो यह केवल पुष्टि ReSharper का उपयोग करें और मेरे पूर्वाग्रह :)

2

पुष्ट समरूपता के लिए और कोडिंग शैलियों है कि सब कुछ चाहते स्पष्ट होना करने के लिए के अनुरूप (व्यक्तिगत रूप से मुझे यह पसंद है .. ।)

1

कुछ कोडिंग शैलियों की सिफारिश है कि आप सभी "सार्वजनिक" आइटम पहले "निजी" आइटमों के बाद रखें। एक "निजी" कीवर्ड के बिना, आप इसे इस तरह से नहीं कर सका।

अद्यतन: मैंने इस पर "सी #" टैग नहीं देखा है, इसलिए मेरा उत्तर सी #+ से अधिक सी ++ पर लागू होता है।

+0

उम, दृश्यता सी # + में मोडल नहीं है जैसे कि यह सी ++ में है। निजी कीवर्ड उस समय के लिए आवश्यक होता है जब यह डिफ़ॉल्ट नहीं होता है (और ऐसे समय होते हैं, जैसे वर्ग घोषणाएं), लेकिन एक विधि के सामने "निजी" डालना वास्तव में अनावश्यक और अनावश्यक है। –

+0

यह सच है, लेकिन सवाल वास्तव में सी # का उल्लेख नहीं किया था। –

+0

टैग पढ़ने के लिए महत्वपूर्ण है। :) –

3

पूर्णता के लिए। और कुछ लोग वास्तव में अपने तरीकों पर एक्सेस संशोधक के बारे में अपने कोड में स्पष्ट होना पसंद करते हैं।

-1

दरअसल, यदि कक्षा या संरचना को एक्सेस संशोधक के साथ घोषित नहीं किया गया है तो यह आंतरिक पर डिफ़ॉल्ट हो जाता है।

तो यदि आप इसे निजी बनाना चाहते हैं, तो निजी का उपयोग करें।

+0

यदि किसी प्रकार को नेस्टेड नहीं किया जाता है तो यह आंतरिक और गैर-नेस्टेड प्रकारों के लिए डिफ़ॉल्ट घोषित नहीं किया जा सकता है (वे आंतरिक दृश्यता से परे निजी क्या होंगे?) –

9

निजी संशोधक इरादा बताता है।

एक निजी सदस्य चर वर्ग के बाहर सीधे हेरफेर के लिए नहीं है। वेरिएबल के लिए एक्सेसर्स सेट/सेट नहीं हो सकते हैं या नहीं।

कक्षा के बाहर उपयोग के लिए एक निजी विधि का इरादा नहीं है। यह केवल आंतरिक कार्यक्षमता के लिए हो सकता है। या आप मूल्यों में गुजरने के बिना कक्षा के निर्माण को रोकने के लिए एक डिफ़ॉल्ट कन्स्ट्रक्टर निजी बना सकते हैं।

निजी संशोधक (और इसके जैसे अन्य) स्वयं दस्तावेज़ कोड लिखने का एक उपयोगी तरीका हो सकते हैं।

1

निजी उपयोग करते हुए स्पष्ट रूप से अपने इरादे का संकेत और अन्य जो अपने कोड का समर्थन करेंगे के लिए सुराग छोड़ देता है;)

5

निजी केवल तरीकों एक प्रकार पर के लिए डिफ़ॉल्ट है, लेकिन निजी संशोधक कहीं और प्रयोग किया जाता है।

C# Language Specification 3.0 (msdn) धारा 3.5.1

संदर्भ में एक सदस्य घोषणा जगह लेता है पर निर्भर करता है से, घोषित पहुंच ताकि केवल विशेष प्रकार की अनुमति है। इसके अलावा, जब किसी सदस्य घोषणा में कोई एक्सेस संशोधक शामिल नहीं होता है, तो जिस संदर्भ में घोषणा होती है वह डिफ़ॉल्ट घोषित पहुंच को निर्धारित करता है।

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

मैं आमतौर पर बाहर निजी छोड़ लेकिन मैं यह कोड अस्तर के लिए उपयोगी पाते हैं:

private int x; 
public string y; 
protected float z; 

वी.एस.:

int x; 

public string y; 
protected float z; 
7

के रूप में अपनी पुस्तक सी # जॉन स्कीट द्वारा बताया गहराई में, सी # में एक स्थान है जहां निजी कीवर्ड को प्रभाव प्राप्त करने की आवश्यकता होती है।

यदि मेरी याददाश्त सही तरीके से कार्य करती है, तो निजी कीवर्ड निजी तौर पर स्कॉप्ड प्रॉपर्टी गेटटर या सेटर बनाने का एकमात्र तरीका है, जब इसके विपरीत निजी पहुंच से अधिक होता है। उदाहरण:

public bool CanAccessTheMissileCodes 
{ 
    get { return canAccessTheMissileCodes; } 
    private set { canAccessTheMissileCodes = value; } 
} 

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

+0

+1: यह प्रश्न पर एक दिलचस्प बात है। –

1

Robert Paulson के रूप में अपने जवाब में कहा, private संशोधक सिर्फ सदस्यों पर नहीं किया जाता है, लेकिन यह भी पर प्रकार। यह महत्वपूर्ण हो जाता है क्योंकि प्रकार के लिए डिफ़ॉल्ट internal है जो InternalsVisibleToAttribute का उपयोग करते समय अनजाने में लीक कर सकता है।

"डिफ़ॉल्ट पहुँच संशोधक निजी लेकिन आंतरिक नहीं है"

ठीक है, कि तुम किस बारे में बात कर रहे हैं पर निर्भर करता है:

64

यहाँ गलत सूचना की एक निश्चित राशि नहीं है। एक प्रकार के सदस्यों के लिए, यह निजी है। शीर्ष-स्तर के प्रकारों के लिए, यह आंतरिक है।

नहीं "निजी केवल एक प्रकार पर तरीकों के लिए डिफ़ॉल्ट है", यह सभी सदस्यों एक प्रकार का के लिए डिफ़ॉल्ट है - गुण, घटनाओं, क्षेत्रों, ऑपरेटर, कंस्ट्रक्टर्स, विधियों, नेस्टेड प्रकार और कुछ भी मैं भूल गया हूँ।

"वास्तव में, वर्ग या struct आंतरिक करने के लिए एक पहुँच संशोधक यह चूक के साथ घोषित नहीं किया गया है"

केवल शीर्ष स्तर के प्रकार के लिए

। नेस्टेड प्रकार के लिए, यह निजी है।

एक भाग के लिए संपत्ति पहुंच को प्रतिबंधित करने के अलावा अन्य नहीं, डिफ़ॉल्ट रूप से डिफ़ॉल्ट रूप से "हमेशा के रूप में प्रतिबंधित हो सकता है।"

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

एरिक लिपर्ट स्पष्ट रूप से जाता है, और मैं भी इस तरह दुबला होना शुरू कर रहा हूं।

इस पर थोड़ा और अधिक के लिए http://csharpindepth.com/ViewNote.aspx?NoteID=54 देखें।

+0

.NET के कुछ संस्करण में _struct_ सदस्यों "public" के लिए डिफ़ॉल्ट संशोधक नहीं था? या मैं कुछ और के साथ उलझन में हूँ? – Konamiman

+0

@ कोनामीमन: ऐसा नहीं है कि मुझे कभी याद है। शायद एक प्री-रिलीज में? –

+0

.NET के साथ मेरा पहला संपर्क 2003 में था, v1.1। शायद मैंने अनजाने में कुछ प्री-रिलीज प्रलेखन पढ़ा था। – Konamiman

संबंधित मुद्दे