2009-08-18 11 views
33

संभव डुप्लिकेट क्या:
Properties vs Methodsविधि बनाम संपत्ति सी # में - अंतर

विधि में आप भी कुछ कोड और गुण में टाइप कर सकते हैं। उदाहरण के लिए मेरे पास एक संपत्ति का नाम है। जब कक्षा का नाम बदलता है तो मैं डेटाबेस से कुछ डेटा प्राप्त करना चाहता हूं और अपनी वस्तु की स्थिति बदलना चाहता हूं। मैं अपनी संपत्ति का हिस्सा सेट करने के लिए इस कोड को जोड़ सकता हूं। अन्य समाधान सेट भाग को निजी में बदलना है और SetName नामक विधि जोड़ें और इस विधि में मेरा कोड जोड़ें।

तो क्या अंतर है? उस बिंदु पर कब होता है जब गेटटर/सेटर को कुछ कोड डालना अच्छा नहीं होता है और जब मेरी संपत्ति और मेरी कक्षा के अन्य हिस्सों को बदलने के लिए उपयोग की जाने वाली अपनी विधि को कब बनाया जाए?

उत्तर

50

यहाँ दिशा निर्देशों जब Bill Wagner (फिक्स्ड लिंक) से तरीकों बनाम गुण का उपयोग करने के

  • एक संपत्ति का उपयोग करें जब इन सभी सही हैं के लिए का एक अच्छा सेट है अपवाद फेंकने के लिए। ध्यान दें कि इसका कोई नेटवर्क (या डेटाबेस) पहुंच का तात्पर्य नहीं है। या तो असफल हो सकता है, और इसलिए अपवाद फेंक देगा।
  • उन्हें एक-दूसरे पर निर्भरता नहीं होनी चाहिए। ध्यान दें कि इसमें एक संपत्ति स्थापित करना और इसे किसी अन्य को प्रभावित करना शामिल होगा। (उदाहरण के लिए, फर्स्टनाम संपत्ति को सेट करना केवल पढ़ने वाले पूर्णनाम गुण को प्रभावित करेगा जो पहले नाम + अंतिम नाम गुणों को इस तरह की निर्भरता का तात्पर्य है)
  • उन्हें किसी भी क्रम में सेटटेबल होना चाहिए
  • गेटर के पास देखने योग्य नहीं है साइड इफेक्ट नोट करें कि यह दिशानिर्देश किसी संपत्ति में आलसी मूल्यांकन के कुछ रूपों को रोकता नहीं है।
  • विधि हमेशा तुरंत लौटनी चाहिए। (ध्यान दें कि यह ऐसी संपत्ति को रोकता है जो डेटाबेस एक्सेस कॉल, वेब सेवा कॉल या अन्य समान ऑपरेशन करता है)।
  • यदि कोई सदस्य सरणी देता है तो विधि का उपयोग करें।
  • गेटटर (कोड को हस्तक्षेप किए बिना) को दोहराए गए कॉल को वही मान वापस करना चाहिए।
  • सेटर को दोहराए गए कॉल (उसी मान के साथ) को एक कॉल से कोई फर्क नहीं पड़ता है।

  • प्राप्तकर्ता को आंतरिक डेटा संरचनाओं का संदर्भ वापस नहीं करना चाहिए (आइटम 23 देखें)। एक विधि एक गहरी प्रतिलिपि वापस कर सकती है, और इस मुद्दे से बच सकती है।

+2

+1 को नियमों के बजाए इसे guidlines कहने के लिए दोबारा करने की आवश्यकता नहीं है - उदाहरण के लिए आलसी लोडिंग या मैपर आमतौर पर इन दिशानिर्देशों का उल्लंघन करता है। –

+0

बिल्कुल, सबकुछ सापेक्ष है - लागू होने पर ही लागू होता है। –

+1

लिंक @ChrisBallance द्वारा आपूर्ति की रिटर्न विधेयक वैगनर द्वारा दिशा-निर्देशों के एक 404. एक कार्यशील लिंक [यहां] है (http://www.srtsolutions.com/properties-vs-methods)। वैसे भी लिंक के लिए +1, क्रिस। –

12

इस

private string _name; 
public string Name { get { return _name; } set { _name = value; } } 

की तरह एक संपत्ति को देखते हुए यह निम्नलिखित दो तरीकों लिखने के लिए संभव है:

public string get_Name() { return _name; } 
public void set_Name(string value) { _name = value; } 

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

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

8

एक संपत्ति कुछ वाक्य रचनात्मक चीनी के अलावा कुछ भी नहीं है। कुछ मामलों में, किसी विधि की बजाय किसी संपत्ति को परिभाषित करना बेहतर है क्योंकि यह स्पष्ट/अधिक पठनीय है।

डिज़ाइन दिशानिर्देश बताते हैं कि, जब आप जिस कार्यक्षमता को कार्यान्वित कर रहे हैं वह महंगा है, तो किसी संपत्ति पर एक विधि को प्राथमिकता दी जानी चाहिए।

वास्तव में, एक संपत्ति को एक या दो तरीकों के रूप में लागू किया जाता है; इस पर निर्भर करता है कि आपकी संपत्ति में एक सेटटर है या नहीं। संपत्ति को get_xxx और set_xxx विधि में अनुवादित किया गया है।

3

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

+0

पूरी तरह से सहमत हैं। विस्तार के लिए डिजाइन, पल के लिए नहीं ... आधे बेक्ड हैक नौकरी। और यह करना एक साधारण बात है, यह कुछ भी अधिक नहीं कर रहा है, आप चीजों को अलग कर रहे हैं, उन्हें ड्रवाई कर रहे हैं, और यहां तक ​​कि यदि कोड को आप किसी विधि में ले जा रहे हैं, तो अभी नहीं किया जा रहा है ... आप कभी नहीं जानते कि जब कोई अन्य या वर्तमान व्यापार प्रक्रिया या आवश्यकता के लिए उसी कोड का उपयोग करने की आवश्यकता हो सकती है। यह गुणवत्ता डिजाइन है। हैक्स कोई अच्छा नहीं है। आपकी संपत्ति से और उस विधि में उस कोड को और अधिक पठनीय बनाता है और साथ ही रखरखाव योग्य और बाद में आसानी से पुन: उपयोग करने के लिए खुला ... – PositiveGuy

1

अनिवार्य रूप से एक संपत्ति दो तरीकों से है - getProperty और setProperty। यह केवल चीज़ का सम्मेलन/सरलीकरण है।

यह माना जाता है कि संपत्ति गेटर के पास कोई साइड इफेक्ट नहीं है (अच्छी तरह से - उनके पास कुछ साइड इफेक्ट हो सकता है, जैसे आलसी लोडिंग)।

0

तरीके कुछ करते हैं। यही कारण है कि आम तौर पर उनके नाम पर क्रियाएं होती हैं।

जबकि संपत्ति डेटा लौटाती है।

लाइन सरल है, एक संपत्ति एक विधि बननी चाहिए यदि यह कक्षा आंतरिक डेटा स्टोर तक पहुंचने के अलावा कुछ और करता है।

उदाहरण के लिए यदि आप किसी उपयोगकर्ता के लिए NumberOfQuetions नामक संपत्ति हैं।अगर इसे किसी विधि के प्रश्नों की संख्या प्राप्त करने के लिए डेटाबेस में जाना है। यदि यह एक आंतरिक स्टोर लौट रहा है, भले ही आंतरिक स्टोर पर कुछ तर्क किया जाता है, तो आप उसे प्राप्त कर सकते हैं। ही टिककर खेल सरल है और इस तरह की संभावना नहीं होना चाहिए:

1

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

1

मूल रूप से कोई अंतर नहीं है (एक सेटर में आरक्षित पहचानकर्ता "मान को छोड़कर)।

गेटर्स और सेटर्स को आंतरिक तरीकों से आंतरिक रूप से अनुवादित किया जाता है जैसे कि रनटाइम को यह नहीं पता कि कुछ गेटटर या सेटर एक निश्चित संपत्ति से जुड़े हैं या नहीं। सिंटैक्टिक चीनी शब्द अक्सर इन तरह की सुविधा संरचनाओं के लिए उपयोग किया जाता है।

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

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

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

3

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

इस प्रकार

, आप पुनः प्राप्ति या आप कोड से आप सदस्य डेटा का एक पहलू के इनपुट के लिए एक साफ परत दे रही है। उदाहरण के लिए

एक डीटीओ लेकिन अच्छी तरह से लिखा गुण, डेटा और व्यवहार cleaving कुशलता का एक समूह कुछ नहीं है। एक डीटीओ के बिना आप कल्पना करेंगे कि आपके डेटाग्रिड या ड्रॉपडाउन को जटिल व्यावसायिक तर्क विधि में कसकर जोड़ना होगा?

यह बस रखो, तरीके वास्तव में क्या कर रहे हैं काम ... गुण या तो कार्रवाई भड़काना या स्थिति मिलता है।

हालांकि, आप अपने गुण के अंदर विधि कोड का उपयोग कर सकते हैं ... यह क्या वे के लिए हैं नहीं है। यहां तक ​​कि, यदि आपको वास्तव में उस कोड में लिखने की बजाय संपत्ति के अंदर किसी अन्य विधि को क्लीन कॉल करने के लिए बेहतर है, तो भी। HTH!

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