2011-01-07 6 views
5

क्या फायदे और दो कोडिंग शैलियों नीचे के बीच मतभेद रहे हैं ...सी # BestPractice: निजी वर और लोक मनुष्य/सेटर या सार्वजनिक वार

public void HelloWorld() { 

     private string _hello; 

     public string Hello {  
      get 
      { 
       return _hello; 
      } 
      set 
      { 
       _hello = value; 
      } 
     } 
} 

या

public void HelloWorld() { 

     public string Hello { get; set; } 

} 

मेरी प्राथमिकता के लिए है संक्षिप्त सरल कोड, लेकिन राय सुनने में दिलचस्पी है क्योंकि मैं कई डेवलपर्स को देखता हूं जो लंबे मार्ग पर जोर देते हैं।

+4

मैं शीर्षक को बदलने के लिए सुझाव दूंगा * "मैन्युअल रूप से कार्यान्वित गुणों और ऑटो गुणों के बीच क्या अंतर है" * या ऐसा कुछ। आपके कोड नमूने में से कोई भी सार्वजनिक चर (या बल्कि फ़ील्ड, जैसा कि इस मामले में होना चाहिए) का खुलासा नहीं करता है। –

उत्तर

14

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

दूसरा फॉर्म कोई अनुकूलन (गेटर और सेटर की पहुंच को छोड़कर) की अनुमति देता है। यह सिर्फ पहले प्रारूप के बराबर एक शॉर्टेंड है।

यदि आपको गेटर और सेटर में कुछ भी विशिष्ट करने की आवश्यकता नहीं है, तो दूसरा फॉर्म आमतौर पर अधिक सुविधाजनक होता है।

+0

समुदाय को 'readonly' के बारे में याद दिलाने के लिए धन्यवाद। –

+1

खराब, उपेक्षित, भूल गए केवल-लिखने वाले गुण ... – WernerCD

4

जब तक आपको निजी बैकिंग फ़ील्ड पर कुछ प्रारंभ करने की आवश्यकता नहीं होती है या किसी अन्य कारण से इसकी आवश्यकता नहीं होती है, तो अधिक संक्षिप्त ऑटो-संपत्ति को आम तौर पर प्राथमिकता दी जाती है।

तो आपके उदाहरण के लिए, जहां बैकिंग फ़ील्ड के साथ कुछ भी नहीं किया जा रहा है, मैं हमेशा ऑटो-प्रॉपर्टी का उपयोग करना पसंद करूंगा।

4

आपका दूसरा उदाहरण सार्वजनिक चर नहीं है, यह सिर्फ एक ऑटो प्रॉपर्टी है। और एक ऑटो प्रॉपर्टी आपके पहले उदाहरण के लिए सिंटैक्टिक चीनी है।

private string _name; 
public string Hello {  
{ 
    get 
    { 
     if(_name == null) 
      _name = "Default Name"; 

     return _name; 
    } 
    set 
    { 
     _name = value; 
     OnPropertyChanged("Hello"); 
    } 
} 
+0

+1 एक उपयोगी उदाहरण पोस्ट करने के लिए +1 –

1

में:

सुदूर एक दूसरे के ऊपर के फायदे का सवाल है, पहले जिस तरह से आप गेटर या सेटर (जैसे नल या एक संपत्ति परिवर्तन सूचना का एक चेक के रूप में) में अतिरिक्त काम करने की अनुमति देता निम्नलिखित में मुझे लगता है कि आपके पास सत्यापन/दुष्प्रभाव जैसी कोई अन्य आवश्यकता नहीं है।

  • केवल #
  • ग के पुराने संस्करणों पर पहले काम करता है केवल पहले एक साधारण क्षेत्र initialiser (बल्कि निर्माता से)
  • केवल पहले क्षेत्र जैसे, [NonSerialized] को विशेषताएं जोड़ना अनुमति देता है की अनुमति देता है
  • दोनों के बीच स्विचिंग (BinaryFormatter उदाहरण के लिए) कुछ serializers तोड़ने के लिए और प्रतिबिंब के आधार पर कर सकते हैं कोड

लेकिन {get;set;} अधिक संक्षिप्त है, और ज्यादातर मामलों में पसंदीदा है।

0

जो भेद आप यहां खींच रहे हैं वह एक स्पष्ट चर का उपयोग करने के बीच है जो एक ऑटो-जेनरेटेड प्रॉपर्टी वैरिएबल का उपयोग करके एक संपत्ति बनाम मूल्य के लिए एक मूल्य संग्रहीत करने के लिए है।

ऐसी कई चीजें हैं जो आप एक स्पष्ट चर के साथ कर सकते हैं जिसे आप स्वत: जेनरेट की गई संपत्ति चर के साथ नहीं कर सकते हैं। आप इसे कन्स्ट्रक्टर की बजाय क्षेत्र की घोषणा में प्रारंभ कर सकते हैं। आप इसे मान्य कर सकते हैं। आप इसे सामान्य कर सकते हैं (जैसे स्ट्रिंग को ट्रिम करना आदि)।

लेकिन यदि आपको इनमें से कोई भी करने की आवश्यकता नहीं है, तो ऑटो प्रोप ठीक है।

1

अगर मैं गलत हूं, तो मुझे सही करें, लेकिन जहां तक ​​मुझे पता है कि आप ऑटो गुणों को डीबग नहीं कर सकते हैं। link text

तो, अगर आपको गेटर/सेटर पर ब्रेकपॉइंट की आवश्यकता है तो आपको वर्बोज़ फॉर्म की आवश्यकता होगी।

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