एनकैप्सुलेशन का अर्थ है कि एक वस्तु की स्थिति केवल एक परिभाषित इंटरफ़ेस के माध्यम से होती है, और इस वजह से वर्ग यह सुनिश्चित कर सकता है कि यह राज्य हमेशा मान्य है और वर्ग के उद्देश्य के अनुरूप है।
इसलिए कुछ मामलों में, यह पूरी तरह से सार्वजनिक रूप से किसी क्षेत्र को उजागर करने के लिए एनकैप्सुलेशन के सिद्धांत को ध्यान में रखते हुए है - क्षेत्र के लिए सभी संभावित मूल्य अन्य सभी क्षेत्रों के अन्य संभावित मूल्यों के साथ मान्य हैं, और इसलिए प्रोग्रामर सक्रिय रूप से क्षेत्र को अनुमति देने का निर्णय ले सकता है। बाहर के कोड द्वारा स्वतंत्र रूप से हेरफेर किया जाना।
ये मामले हालांकि ज्यादातर उन वर्गों के लिए प्रतिबंधित हैं जो ज्यादातर "सादे पुराने डेटा" हैं। वे इस संबंध में बहुत दिलचस्प नहीं हैं, इसलिए उनके बारे में पर्याप्त है।
अन्य मामलों में, अन्य भाषाओं में, एक के पास एक गेटर और सेटर विधि होगी, कुछ ऐसा होगा जो int getId()एक मूल्य प्राप्त करना और void setId(int val)इसे अपडेट करना होगा।
गुण हमें ऐसे तरीकों के माध्यम से पढ़ने और लिखने के लिए एक ही वाक्यविन्यास का उपयोग करते हैं जैसा कि हम एक क्षेत्र को पढ़ने और लिखने के लिए उपयोग करेंगे। यह एक अच्छा संश्लिष्ट चीनी है, हालांकि महत्वपूर्ण नहीं है।
(वास्तव में, जिस तरह से प्रतिबिंब काम करता है और ऐसे मामलों के कारण जैसे कि DataBinder.Evalयह एक संपत्ति के लिए भी आसान हो सकता है जब एक क्षेत्र ठीक काम करेगा, लेकिन यह एक और मामला है)।
जब तक निजी बसर शुरू नहीं किए जाते (वास्तव में, C # 2 के साथ क्या बदला है, एक निजी सेटर और एक ही ब्लॉक में एक सार्वजनिक या संरक्षित गेट्टर होने के लिए वाक्यविन्यास है), हमारे पास निजी सेटर का काम करने के लिए एक निजी तरीका हो सकता है, इसलिए निजी बसने वास्तव में आवश्यक नहीं हैं। वे हालांकि काम कर रहे हैं, इसलिए सिर्फ सियाटिक चीनी के साथ, वे बहुत उपयोगी हैं।
एनकैप्सुलेशन एक मामला है कि क्या आपके सेटर (या गेटर्स) सार्वजनिक, निजी, संरक्षित या आंतरिक हैं, लेकिन क्या वे उचित हैं । प्रत्येक क्षेत्र के निजी (और उस मामले के लिए readonly) होने के डिफ़ॉल्ट के साथ शुरू करें और फिर आवश्यक रूप से उन सदस्यों (चाहे गुण या विधियाँ) को जोड़ें जो उन क्षेत्रों को बदल देते हैं, और यह सुनिश्चित करते हैं कि ऑब्जेक्ट वैसा ही बना रहे जैसा वे बदलते हैं । यह सुनिश्चित करता है कि एक वर्ग ' अपरिवर्तनीय रखा गया है, जिसका अर्थ है कि राज्यों के वैध सेट का वर्णन करने वाले नियम कभी भी टूटे नहीं जा सकते (निर्माणकर्ता यह सुनिश्चित करते हुए मदद करते हैं कि यह ऐसे वैध राज्य में शुरू होता है)।
आपके अंतिम प्रश्न के रूप में, अपरिवर्तनीय होने का मतलब है कि किसी वर्ग की कोई सार्वजनिक, संरक्षित या आंतरिक बसाहट नहीं है और कोई भी सार्वजनिक, संरक्षित या आंतरिक तरीके नहीं हैं जो किसी भी क्षेत्र को बदलते हैं। इस की डिग्री हैं, C # में तीन डिग्री संभव हैं:
सभी श्रेणी के उदाहरण क्षेत्र हैं readonly, इसलिए निजी कोड भी इसे बदल नहीं सकते हैं। यह अपरिवर्तनीय होने की गारंटी देता है (कुछ भी जो इसे बदलने की कोशिश नहीं करता है वह संकलन नहीं करेगा) और संभवतः इसके पीछे अनुकूलन किया जा सकता है।
एक वर्ग बाहर से अपरिवर्तनीय है क्योंकि कोई भी सार्वजनिक सदस्य कुछ भी नहीं बदलता है, लेकिन readonlyअंदर से परिवर्तित नहीं होने के उपयोग की गारंटी नहीं है।
एक वर्ग बाहर से देखे जाने के रूप में अपरिवर्तनीय है, हालांकि कुछ राज्य कार्यान्वयन विस्तार के रूप में बदलते हैं। जैसे कि एक फ़ील्ड को याद किया जा सकता है, और इसलिए बाहर से इसे प्राप्त करने के प्रयास के दौरान बस उसी मूल्य को पुनः प्राप्त करता है, पहला ऐसा प्रयास वास्तव में इसकी गणना करता है और फिर बाद के प्रयासों पर पुनर्प्राप्ति के लिए संग्रहीत करता है।
private File settingsFile = null;और फिर एक निर्माणकर्ता मेंif (settingsFile == null) { settingsFile = GetSettingsFile() };:। इस तरह के कोड को फिर से भरने से मुझे कभी-कभी रोना पड़ता है :)। सिर्फ इसलिए कि आप कंस्ट्रक्टर से पहले एक सदस्य सेट कर सकते हैं, इसका मतलब यह नहीं है कि आपको कई कंस्ट्रक्टर के साथ, इसके लिए, तर्क का पालन करने के लिए यह HARD बनाता है। निजी सेटर आपको कंस्ट्रक्टर के अंदर या बाद में मान सेट करने के लिए मजबूर करते हैं।