2015-05-25 12 views
10

मैं Outlook 2013 के लिए एक VSTO एडिन में .NET 4.5 का उपयोग कर रहा हूं। मुझे कुछ परेशानी पूरी तरह से गुणों और एक्सेसर्स को समझने में समस्या है। स्वतः लागू किए गए एक्सेसर्स जिन्हें मैं मानता हूं वे तब होते हैं जब आप लिखते हैं; सेट; {// कोड}, आदि प्राप्त करने के बजाय मुझे परेशानी भी दे रही है। मेरे पास एक कक्षा है जो मैं अपनी कक्षा में आंतरिक रूप से उपयोग करता हूं।गुण और ऑटो-कार्यान्वयन

private Dictionary<string, string> clientDict { get; set; } 
private Dictionary<string, string> clientHistoryDict { get; set; } 

तो बाद में:

clientDict = new Dictionary<string, string>(); 
clientHistoryDict = new Dictionary<string, string>(); 

मैं बाद में कोड में गुण के रूप में ही नाम का उपयोग कर रहा हूँ, एक ही कक्षा के भीतर यहाँ मेरी कोड है।

मैं वास्तव में लिखना कभी नहीं:

private Dictionary<string, string> _clientDict; // etc. 

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

मैंने ऐसा करने के लिए अपना कोड बदलने की कोशिश की, और मुझे कुछ समस्याएं थीं और एहसास हुआ कि गुणों की मेरी समझ थोड़ा मिश्रित है।

यहां कुछ प्रश्न हैं जिन्हें मुझे स्पष्ट करने की आवश्यकता है कि मुझे सही उत्तर नहीं मिल रहा है।

पहला, क्या निजी संपत्ति का उपयोग करने का कोई कारण है? मेरे शब्दकोशों को कक्षा के बाहर या किसी भी व्युत्पन्न कक्षाओं में कभी भी एक्सेस नहीं किया जाता है, इसलिए गुणों का उपयोग करने का कोई कारण भी है? मैं किसी भी विशेष सत्यापन या सेटटर या कुछ भी इस तरह का उपयोग नहीं करता हूं।

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

आखिरकार, जब मैं उसी वर्ग में संपत्तियों पर नया कॉल करता हूं, जिसमें इसे घोषित किया जाता है, तो संपत्ति के साथ ऐसा करने और उसी प्रकार के सामान्य चर के बीच क्या अंतर होता है? क्या संपत्ति उस मामले में चर से भिन्न होती है? क्या यह गुणों का उपयोग करने के लिए खराब तरीका है जब इसे निजी चर के साथ पूरा किया जाना चाहिए?

ये कुछ गुमराह प्रश्न हो सकते हैं लेकिन मुझे कोई अन्य स्थान नहीं मिल रहा है जिसमें जानकारी मुझे इन भेदों को समझने में मदद करने के लिए है। मैं इस सब को खोजने और समझने के लिए गुणों के साथ खेल रहा हूं लेकिन मैं सहायता कर सकता हूं ताकि मैं सहायता कर सकूं।

उत्तर

11

First, is there any reason to use a private property?

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

Why would it not auto-implement the setter for me in this instance?

हमें समझना होगा कि ऑटो-कार्यान्वित गुण काले जादू नहीं हैं। संकलक हमारे लिए एक निजी बैकिंग फ़ील्ड उत्पन्न करेगा, बजाय एक स्वयं को प्रदान करने के बजाय।अपने दृष्टिकोण से, वह देखता है कि आपके पास एक गेटटर है जो एक निजी क्षेत्र लौटाता है, लेकिन सेटर स्वचालित है, जो कि आपके कोड में तार्किक त्रुटि किसी प्रकार का संकेत देगा। आप एक मूल्य क्यों वापस करेंगे लेकिन एक पूरी तरह से अलग सेट करें? जब आप बैकिंग फ़ील्ड के साथ कोई संपत्ति बनाते हैं, तो आपको गेटटर और सेटर्स, those are the rules दोनों प्रदान करना होगा।

when I call new on the properties in the same class that it is declared in, what is the difference between doing that with a property and a normal variable of the same type?

शब्दार्थ कुछ भी नहींnew निर्माण के प्रकार से संबंधित है और एक कन्स्ट्रक्टर कॉल उत्सर्जित करेगा। अंतर एक बार नव निर्मित वस्तु असाइन किया गया है। एक फ़ील्ड संकलक को stfld ऑपोड को उत्सर्जित करने का कारण बन जाएगा। संपत्ति के लिए यह संपत्ति सेटर का आह्वान करने के लिए call उत्सर्जित करेगा। जब आप किसी संपत्ति को एक्सेस करते हैं, तो संकलक get_YourPropertyName को ldfld बनाकर फ़ील्ड पर कॉल कर देगा।

Is it bad practice to use properties this way when it should be accomplished with private variables?

मैं इसे खराब अभ्यास नहीं कहूंगा, लेकिन मुझे यह एक निजी संपत्ति रखने के लिए थोड़ा अजीब लगेगा।

खेतों और गुण में अधिक जानकारी के लिए, देखें What is the difference between a Field and a Property in C#?

+0

भारी मदद बहुत बहुत धन्यवाद, बस कुछ स्पष्टीकरण? फ़ील्ड द्वारा आपका मतलब क्या है कि एक्सेस विनिर्देश नहीं हो सकते हैं? क्या कोई निजी सदस्य चर इसका उदाहरण नहीं होगा? मुझे लगता है कि मुझे क्षेत्र में क्या मतलब है याद आ रही है। – shenk

+2

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

+0

@ शेन्क एक संपत्ति यह कर सकती है: 'सार्वजनिक स्ट्रिंग Foo {get; संरक्षित सेट; } ', जिसका अर्थ है कि व्युत्पन्न प्रकार केवल' Foo' के मान को सेट कर सकते हैं। एक क्षेत्र ऐसा नहीं कर सकता है। –

3

Is there any reason to use a private property?

नहीं - कि ऑटो कार्यान्वयन के पूरे मुद्दे है। यह आपको उस अतिरिक्त कोड को लिखने के लिए बचाता है जब आप जो करना चाहते हैं वह निजी सदस्य चर में क्या मिलता है या सेट करता है। नेट दृश्यों के पीछे छायांकन निजी सदस्य चर के निर्माण को संभालता है।

When I tried to change my code to use variables and then access them via the properties like your typical property example would, I ran into problems. I found an example where the getter was set to return _clientDict, but the setter was just set; It gave me the error: that I must give set a body because it's not abstract or partial. Why would it not auto-implement the setter for me in this instance?

मेरी समझ यह है कि यह ऑटो कार्यान्वयन के साथ सब कुछ या कुछ भी नहीं है। (यद्यपि वहां सुधार करने के लिए खुला)। मैंने कहा कि मैंने सेट ब्लॉक के साथ कोड संकलित देखा है जिसे बस set { } के रूप में परिभाषित किया गया है। संपादित करें: set { } ब्लॉक को स्पष्ट करने के लिए बस वास्तव में मूल्य निर्धारित नहीं किया जाएगा, यह अनिवार्य रूप से कॉल निगलता है और कुछ भी नहीं करता है - हालांकि यह संकलित होगा।

When I call new on the properties in the same class that it is declared in, what is the difference between doing that with a property and a normal variable of the same type? Do properties differ at all from variables in that case? Is it bad practice to use properties this way when it should be accomplished with private variables?

जहाँ तक मैं वाकिफ हूँ कोई वास्तविक अंतर नहीं है। वही बात हो रही है, बस यही है कि नेट आपके लिए नलसाजी को संभालने में कामयाब रहा है।

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