2010-02-12 8 views
7

मैं यह सब समय देखें:आप सी # गेटर/सेटर्स के साथ निजी चर का उपयोग क्यों करते हैं?

private int _myint; 

    public int MyInt 
    { 
     get 
     { 
      return _myint; 
     } 
     set 
     { 
      _myint = value; 
     } 
    } 
मेरे लिए

इस के समान लगता है:

public int MyInt{ get; set; } 

तो क्यों हर कोई बिल्कुल पूर्व ... क्यों निजी वीएआर क्या करता है ?!

+6

* दोनों * मामलों में एक निजी चर है, हालांकि दूसरे मामले में यह संकलक द्वारा उत्पन्न होता है। –

उत्तर

31

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

+3

घटनाओं के लिए बीएफआर का जिक्र करने का सही उदाहरण एमवीवीएम में है, जहां आपको GUI को नए डाटाबेसिंग मान को प्रतिबिंबित करने के लिए प्रॉपर्टी चेंज को बढ़ाने की आवश्यकता है। – Dave

4

सबसे पहले, आपके द्वारा उपयोग किए जाने वाले वाक्यविन्यास नए हैं। यह सी # के पुराने संस्करणों में मौजूद नहीं था।

दूसरा, यदि आप डिफ़ॉल्ट मान प्राप्त करने वाले हैं, या परिणाम आलसी लोड करते हैं तो आपको निजी चर की आवश्यकता है।

2

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

सी # स्वचालित गुणों के साथ अब यह पारदर्शी बनाता है।

2

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

1
public int MyInt{ get; set; } 

स्वचालित गुण नामक सी # 3.0 में जोड़ा गया एक विशेषता थी। सी # 2.0 इसका समर्थन नहीं करता है और स्पष्ट चरम और सेटर्स के साथ निजी चर की आवश्यकता है। इसलिए, बहुत सारे पुराने कोड या पीछे के संगत कोड स्पष्ट गेटर्स और सेटर्स का उपयोग करेंगे।

2

ऐसा करने का यह पुराना तरीका है। जिस तरह से आप पसंद करते हैं ("स्वचालित गुण") यह भाषा में अपेक्षाकृत नया निर्माण है। कुछ साल पहले, हमें हमेशा निजी चर का उपयोग करना पड़ता था।

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

6

मैं,

public int MyInt{ get; private set; } 

अधिक देखना चाहते हैं;)

लेकिन @BFree यह

+0

अच्छी तरह से मैं उस वर्ग में "निजी सेट" कैसे करूं? – herzmeister

+0

@hdw - आप इसे कक्षा में सेट कर सकते हैं, आप इसे कक्षा के बाहर से सेट नहीं कर सकते हैं। – Steve

+0

मैं कक्षाओं के मामले में उस पैटर्न का बहुत उपयोग करता हूं जहां मेरे पास 'डंप गुण' है; हालांकि, जैसा कि अन्य प्रतिक्रियाओं में उल्लिखित है, स्वचालित संपत्ति किसी भी कस्टम तर्क को रोकती है जिसे प्राप्त करने या सेट के दौरान होने की आवश्यकता हो सकती है। –

1

आप उत्पादन परावर्तक एक जैसे उपकरण के साथ संकलक द्वारा उत्पादित को देखें, तो किसी न किसी निजी क्षेत्र जोड़ा गया है

4

@BFree कह रहा है कि विस्तार करने के लिए एक उदाहरण:

private int _Whatever; 
public int Whatever 
{ 
    get {return _Whatever;} 
    set 
    { 
     if(value != _Whatever) 
     { 
      // It changed do something here... 
      // maybe fire an event... whatever 

     } 

     _Whatever = value; 

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