2008-10-03 20 views
24

क्या किसी और ने लोगों को यह देखा है:एक्सेसर्स के साथ निजी चर बनाम सार्वजनिक चर

private string _name; 
public string Name{ get{ return _name; } set{ _name = value;}}

मैं एक्सेसर्स का उपयोग करके समझता हूं कि अगर आप इसे प्राप्त करते हैं तो किसी प्रकार का नियंत्रण करने जा रहे हैं या प्राप्त होने पर किसी प्रकार का फ़ंक्शन निष्पादित करते हैं। लेकिन अगर आप ऐसा करने जा रहे हैं, तो क्यों न केवल परिवर्तनीय जनता को शुरू करने के लिए? क्या मैं कुछ भूल रहा हूँ?

उत्तर

35

यदि आप सदस्य को सार्वजनिक क्षेत्र बनाते हैं, तो आप बाद में इसे बिना किसी संपत्ति में पुन: सक्रिय कर सकते हैं आपकी कक्षा के लिए इंटरफ़ेस। यदि आप इसे बहुत शुरुआत से संपत्ति के रूप में उजागर करते हैं, तो आप संपत्ति एक्सेसर फ़ंक्शंस में जो भी बदलाव कर सकते हैं, उसे बदल सकते हैं और कक्षा का इंटरफ़ेस अपरिवर्तित बनी हुई है।

ध्यान दें कि सी # 3.0 के रूप में, आप बैकिंग फ़ील्ड बनाये बिना किसी संपत्ति को कार्यान्वित कर सकते हैं, उदा।:

public string Name { get; set; } 

यह सार्वजनिक क्षेत्रों को पहले स्थान पर लागू नहीं करने के लिए केवल एकमात्र औचित्य को हटा देता है।

+2

थोड़ा सा सुधार (हालांकि मैं सामान्य जोर से सहमत!) - स्वचालित रूप से लागू किया गुण सी # 3.0 का हिस्सा है, नहीं .NET 3.0 है। भाषा और ढांचे के बीच के अंतर के बारे में स्पष्ट होना उचित है। –

+1

हाँ। एक वीबीनेट उपयोगकर्ता के रूप में मुझे दुख है कि हमें इस तरह की उपहार नहीं मिलती है। –

+2

मैं जानता हूँ कि यह एक पुरानी धागा है, लेकिन मैं उन है कि खोज इंजन से यहाँ आया (मेरे जैसे) के लिए इस जोड़ना चाहते हैं: : http: .NET 4.0 के रूप में, VB.NET भी स्वत: लागू किया गुण का समर्थन करता है // msdn.microsoft.com/en-us/library/dd293589.aspx – Nullius

0

तैयारी। आप कभी नहीं जानते कि आप सड़क के नीचे सेट एक्सेसर को कब हटाना चाहते हैं, सेटर में अतिरिक्त ऑपरेशन करना चाहते हैं, या प्राप्त करने के लिए डेटा स्रोत बदलना चाहते हैं।

0

सार्वजनिक रूप से सुलभ सदस्यों को आमतौर पर विधियों और फ़ील्ड नहीं होना चाहिए। यह सिर्फ अच्छा अभ्यास है, और यह अभ्यास आपको यह सुनिश्चित करने में मदद करता है कि आपकी वस्तुओं की समाप्ति स्थिति हमेशा आपके नियंत्रण में है।

6

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

13

आप विधानसभा एक में एक संपत्ति के साथ एक सार्वजनिक इंटरफेस को परिभाषित करते हैं, तब विधानसभा बी में इस इंटरफेस इस्तेमाल कर सकते हैं

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

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

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

3

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

2

चर वर्ग के कार्यान्वयन का हिस्सा हैं। गुण अधिक तार्किक रूप से इंटरफ़ेस का प्रतिनिधित्व करते हैं। सी # 3.0 के साथ, स्वचालित रूप से कार्यान्वित गुण इसे शुरुआत से करने के लिए एक हवा बनाते हैं।

मैंने इस पर और अधिक विचार लिखे हैं, जिसमें एक वैरिएबल से संपत्ति में परिवर्तन करने के विभिन्न तरीकों सहित an article on the topic में बाइनरी संगतता बल्कि स्रोत संगतता भी नहीं है।

0

encapsulation के लिए, सार्वजनिक क्षेत्रों का उपयोग करने की अनुशंसा नहीं की जाती है।

http://my.safaribooksonline.com/9780321578815/ch05lev1sec5?displaygrbooks=0

क्रिस एंडरसन के रूप में बाद में इस पुस्तक में कहा था, यह करता है, तो फोन करने वाले बनाम संपत्ति क्षेत्र के अंतर के अंधे थे होगा आदर्श होगा।

0

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

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

6

यह ध्यान देने योग्य .NET में DataBinding भी सार्वजनिक क्षेत्रों काम करने के लिए मना कर दिया और गुण की मांग है कि लायक हो सकता है। तो यह एक और कारण हो सकता है।

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