2012-10-04 20 views
10

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

कुछ स्थितियों में कोड इस तरह दिखता है:

private string _something; 
    public string Something 
    { 
     get { return _something; } 
     set { _something = value; } 
    } 

हालांकि, अन्य उदाहरण में वे इस समर्थन सदस्य का उपयोग नहीं करते और इसलिए यह अधिक इस तरह है:

public string Something { get; set; } 

मुझे नहीं पता वास्तव में इन बैकिंग चर (_something) का उपयोग करने का लाभ देखें, बशर्ते कि आपके पास चर की सेटिंग के संबंध में कुछ जटिल तर्क न हो।

मैं बाद के दृष्टिकोण का उपयोग करके अपना प्रोग्राम लिख रहा हूं, लेकिन जांचना चाहता था कि मैंने कुछ भी याद नहीं किया है।

क्या कोई कृपया बता सकता है कि लोगों ने पूर्व में क्यों चुना? क्या यह और अधिक 'अच्छा अभ्यास' है?

बहुत बहुत धन्यवाद!

+0

मुझे लगता है कि बाद में जावा में 'इंटरफेस' की तरह प्रोटोटाइप परिभाषा है। –

+0

@ सुज़ानसिओक नोप। यह वही है - लेकिन सी # कंपाइलर द्वारा आपके लिए बैकिंग फ़ील्ड लागू किया गया है। –

+0

आह नहीं, मैं गलत हूं। बैकिंग वेरिएबल अंतर्निहित होने वाला यह नया वाक्यविन्यास है। –

उत्तर

8

मुझे वास्तव में इन बैकिंग चर (_something) का उपयोग करने का लाभ नहीं दिखाई देता है जब तक कि आपके पास चर की सेटिंग के संबंध में कुछ जटिल तर्क न हो।

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

बेशक, जैसे ही आपको अतिरिक्त तर्क पेश करने की आवश्यकता होती है, फिर बैकिंग स्टोर का प्रबंधन करना महत्वपूर्ण हो जाता है।

+0

तो क्या कंपाइलर इसे जोड़ने का काम करने के साथ और अधिक ओवरहेड है? – Riana

+1

@AngelBrighteyes नहीं - यह वही है जैसा कि आप इसे स्वयं लिखते हैं। यह सिर्फ कम टाइपिंग है। (और एक अलग, कंपाइलर जेनरेट फ़ील्ड नाम) –

+3

@ एंजेलब्राइटिस - यह सिर्फ "सिंटेक्टिक चीनी" कहलाता है इसका एक उदाहरण है। छोटा कोड, लेकिन दृश्य के पीछे बिल्कुल वैसे ही काम करता है। –

5

पूर्व वाक्यविन्यास .NET 3.5 से पहले आवश्यक था और इसलिए पुराने कोड में पाया जाता है।

यह कार्यात्मक रूप से समतुल्य है।

+0

बिल्कुल सही, शीघ्र उत्तर के लिए धन्यवाद! – rioubenson

2

सार्वजनिक स्ट्रिंग कुछ {प्राप्त; सेट; } बस छोटा हाथ है। पृष्ठभूमि में यह उपरोक्त जैसा ही काम कर रहा है।

1

पहला वाक्यविन्यास का उपयोग करने का एक अच्छा कारण एमवीवीएम आर्किटेक्चर के साथ उपयोग के लिए है जहां आपकी गुण सामने वाले तत्वों के लिए बाध्य हैं।

कुछ की तरह:

private string _something; 
    public string Something 
    { 
     get { return _something; } 
     set { 
       _something = value; 
       OnNotifyPropertyChanged("Something"); 
      } 
    } 

कि आपके सामने अंत सचेत होता है कि इसके लिए बाध्य संपत्ति बदल दिया गया है और यह अद्यतन करना होगा।

+0

आह, शायद यह वही है जो मैं देख रहा हूं। मैं एमवीवीसी आर्किटेक्चर का उपयोग करके अपना आवेदन बनाने का प्रयास कर रहा हूं, इसलिए इसके साथ पकड़ने के लिए बहुत से ट्यूटोरियल्स का उपयोग किया है। मुझे संदेह है कि यह मेरा भ्रम है जहां मेरा भ्रम है। धन्यवाद। – rioubenson

0

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

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

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