2010-07-09 4 views
12

किसी प्रोजेक्ट के भीतर एक नई कक्षा को परिभाषित करते समय ऐसा करने के लिए सही/सर्वोत्तम अभ्यास क्या है?कक्षा गुणों को सही ढंग से परिभाषित करने के लिए कैसे करें?

public class MyClass 
    { 
     public string FirstName {get; set;} 
     public string LastName {get; set;} 
    } 

आम तौर पर मैं एक परियोजना के भीतर संग्रह के निर्माण के लिए इस जैसे एक वर्ग का उपयोग करेंगे: अतीत में मैं इस तरह के रूप कक्षाओं बनाया है।

हालांकि के रूप में मैं जानने के लिए और सी # के बारे में अधिक पढ़ने के लिए जारी रखने के लिए तेज मैं कहाँ वर्ग के रूप में परिभाषित कर रहे हैं उदाहरण देखें: इस सी # के भीतर एक स्वीकृत आशुलिपि संस्करण है पहले दृष्टिकोण परिभाषा गलत है

class MyClass //not set to public 
    { 
     private string _firstName; //first defined as fields 
     private string _lastName; 

     public string FirstName // then defined as properties 
     { 
      get { return _firstName; } 
      set { _firstName = value; } 
     } 
     public string LastName 
     { 
      get { return _lastName; } 
      set { _lastName = value; } 
     } 
    } 

या? एक सर्वोत्तम अभ्यास के रूप में आप हमेशा निजी फ़ील्ड के साथ कक्षा को पहले परिभाषित करते हैं और फिर उन्हें मूल्य के लिए सेट/सेट का उपयोग करके गुणों के रूप में परिभाषित करते हैं?

मैं पूछता हूं क्योंकि मैं स्वयं सी # में पढ़ाया जाता हूं और मैं विकास के लिए उचित दृष्टिकोण को समझने और बेहतर तरीके से समझने की कोशिश कर रहा हूं और कुछ नमूनों और ट्यूटोरियल्स को आसानी से ठोस दृष्टिकोण के बिना राज्य दृष्टिकोणों के बारे में बताता हूं कि क्यों एक दृष्टिकोण को प्राथमिकता दी जाती है (या किया जाना चाहिए) दूसरे पर।

अपने पहले उदाहरण में अग्रिम

+0

दूसरे उदाहरण में, _lastname फ़ील्ड के बाद एक बंद ब्रेस नहीं होना चाहिए। यह वर्ग परिभाषा के अंत में होना चाहिए। संपत्तियों को अभी भी कक्षा ब्लॉक के भीतर परिभाषित किया गया है। (जब तक कुछ ऐसा नहीं होता जो मुझे सी # के बारे में नहीं पता) –

उत्तर

16

आपका का पहला उदाहरण:

public class MyClass 
{ 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
} 

विशेष रूप से Auto-Implemented Properties # 3.0 ग में शुरू की गई है। न तो प्रारूप गलत है। पहला 'शॉर्टेंड' का अधिक है।

अधिक जटिल प्रकार के साथ

, यह कभी कभी अभी भी उपयोगी है पुरानी शैली का उपयोग करने के लिए, और इस तरह के रूप में एक निजी चर से केवल कुछ गुण या मान, बेनकाब:

public class MyClass 
{ 
    private Dictionary<int, List<string>> _someInternalDictionary; 

    public int MyValuesCount 
    { 
     get 
     { 
      return _someInternalDictionary.Values.Count; 
     } 
    } 

} 

एक कच्चे उदाहरण लेकिन उम्मीद है कि आप प्राप्त मेरी विचार।

+5

+1; सबसे पहले गूंगा गुणों के लिए एक बहुत अधिक सुविधाजनक है, और यदि आपको खुद को तर्क की आवश्यकता होती है तो आसानी से दूसरे में परिवर्तित किया जा सकता है। – tzaman

+0

@ टाज़मान: अच्छी तरह से कहा। मेरे विचार से भी। –

+0

और भी बेहतर: पहले 'गूंगा' को स्वचालित रूप से फिर से लिखा जा सकता है यानी INOTifyProperty संकलन समय पर संकलित किया गया है यानी पोस्टशर्प – quetzalcoatl

13

आशुलिपि वाक्यविन्यास (ऑटो कार्यान्वित गुण) में धन्यवाद 3.0 में पेश किया गया था सी #, और फिर से पहले मान्य नहीं था। कंपाइलर वास्तव में उन्हें बैकिंग फ़ील्ड्स के साथ पूर्ण रूप में परिवर्तित करता है।

सी # 3.0 से पहले, गुणों को परिभाषित करने का एकमात्र सही तरीका बैकिंग फ़ील्ड के साथ था।

सी # 3.0 के साथ भी, यदि आप अपनी संपत्तियों में कोई तर्क चाहते हैं, तो आपको उन्हें बैकिंग फ़ील्ड का उपयोग करने के लिए रूपांतरित करने की आवश्यकता है।

संक्षेप में - गूंगा गुणों (जो कुछ भी नहीं करते हैं) के लिए, ऑटो गुणों का उपयोग करें। वे आपके कोड को पढ़ने के लिए आसान और आसान बनाते हैं और परिवर्तित किए जा सकते हैं।

+0

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

4

आपके पास दो कक्षाएं कार्यक्षमता और विशेषताओं में समान हैं।

स्वचालित गुण वाक्यविन्यास (प्रथम श्रेणी) का उद्देश्य मूल रूप से आपको यह दिखाने का एक त्वरित तरीका है कि आप जो दूसरी कक्षा दिखाते हैं, वही है।

मैं पहले संस्करण के साथ चिपके रहते हैं जब तक आप गेटर या सेटर विधि के लिए कोड जोड़ने की आवश्यकता होगी (संपत्ति के लिए एक नया मान मान्य की तरह।)

स्वत: संपत्ति वाक्य रचना के उद्देश्य को दोहरी है, यह गया था आंशिक रूप से लिंक की सुविधा के लिए जोड़ा गया, और आंशिक रूप से यह सुनिश्चित करने के लिए जोड़ा गया कि आप गुणों की घोषणा करें, न कि सार्वजनिक फ़ील्ड।

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

+0

क्या आप विस्तार से बता सकते हैं कि स्वचालित गुण LINQ को कैसे सुविधाजनक करते हैं? मुझे खुद कनेक्शन नहीं दिख रहा है। – LukeH

+0

वे अज्ञात प्रकार के पैकेज के हिस्से के रूप में जोड़े गए थे। –

+1

ठीक है, मैं अभी भी नहीं देखता कि उन्हें लिंक के लिए क्यों जरूरी था। एचएम ... –

0

तुम भी प्राप्त और सेट के लिए पहुँच संशोधक इस्तेमाल कर सकते हैं ...

public {ReturnType} MyProperty { {Access Modifier}get; {Access Modifier}set; } 

और मुझे लगता है आप पहले से ही Access Modifier का ज्ञान है।