2009-06-09 17 views
23

मैं लॉग 4नेट के लिए कुछ कोड की समीक्षा कर रहा था और मैं इस पर आया।सी # निजी, स्थैतिक, और केवल

private static readonly ILog logger = LogManager.GetLogger(typeof(AdminClient)); 

मुझे आश्चर्य है कि आपको निजी स्थैतिक पढ़ने की आवश्यकता क्यों होगी।

मेरी समझ से निजी का मतलब यह होगा कि जब तक कोई एक्सेसर विधि न हो या संपत्ति प्राप्त न हो तो चर के बाहर चर का उपयोग नहीं किया जा सकता है।

स्थिर का अर्थ यह होगा कि चर केवल इस फ़ाइल में ही स्कॉप्ड किया गया है।

केवल पढ़ने का मतलब यह होगा कि आप केवल मूल्य से पढ़ सकते हैं और इसे असाइन नहीं कर सकते हैं।

तो, मैं सोच रहा हूं कि वह व्यक्ति जिसने यह कोड लिखा था। इसे निजी घोषित किया क्योंकि वे नहीं चाहते हैं कि यह कक्षा और स्थिर के बाहर उपयोग किया जाए ताकि वह फ़ाइल के बाहर उपयोग न करें। हालांकि, अगर कोई संपत्ति प्राप्त हो जाती है तो इस फॉर्म को रोकने से रोकेंगी।

मुझे लगता है कि मैं केवल पढ़ने के लिए समझ सकता हूं और मान केवल पढ़ने और सेट नहीं किया जाना है।

किसी भी सलाह के लिए बहुत धन्यवाद,

+0

इस विशिष्ट पैटर्न पर एक तरफ एक दिलचस्प: मैं एक बार इस 'संरक्षित घोषित स्थैतिक रीडोनली 'और जिसने मुझे "[सीए 2104] (https://msdn.microsoft.com/en-us/library/ms182302.aspx) अर्जित किया: वीएस कोड विश्लेषण से चेतावनी" केवल म्यूटेबल संदर्भ प्रकारों को पढ़ने की घोषणा न करें। जैसा कि उल्लेख किया गया है [http://stackoverflow.com/a/15745885/268066), "ए 'संरक्षित रीडोनली' फ़ील्ड वास्तव में स्पष्ट नहीं है। 'संरक्षित' के रूप में, आप उम्मीद कर सकते हैं कि व्युत्पन्न कक्षा क्षेत्र शुरू करें।" घोषणा को 'निजी स्थैतिक रीडोनली' में बदलना यह तय किया गया है। – CrazyPyro

उत्तर

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

अच्छा, आपने यहां बहुत स्पष्ट छोड़ा –

+0

आपके द्वारा पोस्ट किया गया लिंक मर चुका है – Natrium

6

स्थिर इसका मतलब यह नहीं है कि यह अन्य फ़ाइलों से पहुँचा नहीं जा सकता - यह सी नहीं है static मुख्य शब्द का अर्थ है कि लकड़हारा वस्तु एक उदाहरण चर के बजाय एक वर्ग चर रहा है, तो भी जब तक पहुँच उस वर्ग की विभिन्न वस्तुओं, वे सभी एक ही लॉगर ऑब्जेक्ट का संदर्भ लेंगे।

9

मुझे लगता है कि आप स्थैतिक गलतफहमी कर रहे हैं। स्टेटिक का मतलब यह नहीं है कि "फाइल के बाहर इस्तेमाल नहीं किया जा सकता है।" स्टेटिक माध्यम: प्रति वर्ग एक है। यह घोषणा क्या करता है वह एक लॉगर बनाता है जिसे केवल एक बार (स्थैतिक) आवंटित किया जाता है, केवल कक्षा में उपलब्ध होता है (व्युत्पन्न कक्षाओं में नहीं) (निजी), और इसके आरंभिक (केवल पढ़ने के लिए) के लिए लिखा नहीं जा सकता है।

हालांकि अच्छा सवाल है!

2

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

1

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

एक स्थिर सदस्य 'लॉगजर' क्यों है? यह एक डिजाइन निर्णय है। मुझे यह जानने की जरूरत है कि आप इस सवाल का जवाब देने के लिए इसका उपयोग कैसे कर रहे हैं। यह केवल पढ़ा क्यों है? क्योंकि ऐसा लगता है कि यह एक बार शुरू हुआ है और इसका उदाहरण पूरे समय उपयोग किया जाता है। हम यह सुनिश्चित कर सकते हैं कि लॉन्गर के मूल्य के साथ कोई भी अन्य इसे 'केवल पढ़ने' के बाद सही नहीं कर देता है।

2

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

1

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

logger = LogManager.GetLogger(typeof(AdminClient)); 
कहीं और में

कुछ लिख कर यकीन है कि हम गलती से एक नई वस्तु के साथ चर अधिलेखित नहीं किया, कर सकते हैं हमारी कक्षा। केवल पढ़ने के लिए के साथ यह सिर्फ संकलन नहीं होगा (जब तक यह पहले से प्रारंभ नहीं किया गया था, और हम (स्थिर) निर्माता में हैं)

1

स्थैतिक चर में "वर्ग चर" की श्रेणी गिर जाता है, एक वर्ग चर एक है हैं कि क्लास ऑब्जेक्ट के बजाए क्लास से जुड़े, दूसरी तरफ इंस्टेंस वैरिएबल वेरिएबल्स हैं जिन्हें क्लास ऑब्जेक्ट के साथ गठित किया जाता है, हर बार जब क्लास ऑब्जेक्ट को इंटिलाइज्ड किया जाता है तो इस ऑब्जेक्ट में "इंस्टेंस वैरिएबल" (गैर स्थैतिक) की अपनी प्रतिलिपि होगी, जबकि स्थैतिक चर कार्यक्रम चलाने में कक्षाओं की सभी वस्तुओं के बीच साझा किया जाता है जैसे लिंक किए गए सूची आदि का आकार केवल पढ़ने के लिए सी # कीवर्ड है जिसका प्रयोग एक परिवर्तनीय रीडोनली बनाने के लिए किया जाता है, जावा ऐसी सुविधा प्रदान नहीं करता है जिसे आप उन चरों तक पहुंचने के लिए सार्वजनिक विधि लिखना चाहते हैं जिन्हें आप प्राप्त नहीं करना चाहते हैं स्वभाव।

0

क्षमा करें, मुझे पता है कि यह पहले से ही उत्तर दिया गया है और यह वास्तव में पुराना है, लेकिन मैं इस लेख में आने वाले किसी भी व्यक्ति को यह बताना चाहता हूं कि इस तरह आप "सिंगलटन" पैटर्न सेट अप करते हैं। कोई भी जो प्रश्न में कोड उदाहरण के बारे में और जानना चाहता है, उसे सिंगलेट्स और उनके उपयोग के तरीके (मध्यस्थ, लॉगर्स, एसिंक कॉलबैक इत्यादि) के बारे में और अधिक सीखने से लाभ होगा। एकमात्र
http://msdn.microsoft.com/en-us/library/ff650316.aspx
http://msdn.microsoft.com/en-us/library/ff650849.aspx

के बारे में

// mothership के सामान // उनके बारे में एक महान बहुत चर्चा
What is so bad about singletons?

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