2009-09-03 13 views
42

के बजाय गुण का उपयोग करने के यह शायद व्यक्तिगत पसंद की बात है, लेकिन मैं कह सकते हैं जब आप अपने कोडजब कार्यों

उदाहरण कोई त्रुटि लॉग पाने के लिए के लिए में कार्यों के बजाय गुण का उपयोग करते हैं

string GetErrorLog() 
{ 
     return m_ErrorLog; 
} 

या मैं

string ErrorLog 
{ 
    get { return m_ErrorLog; } 
} 

कैसे आप जो एक का उपयोग करने का फैसला करते सकता है? मैं अपने उपयोग में असंगत प्रतीत होता हूं और मैं अंगूठे का एक अच्छा सामान्य नियम ढूंढ रहा हूं। धन्यवाद।

+0

http://stackoverflow.com/search?q=c%23+properties में कम से कम 3 उत्तरों का डुप्लिकेट। –

उत्तर

68

मैं गुण का उपयोग करने के तो निम्न बात कर रहे हैं करते हैं:

  • संपत्ति एक एकल, तर्क मूल्य
  • कम या कोई तर्क शामिल है वापस आ जाएगी (आमतौर पर सिर्फ एक मान, या एक छोटे से करना चेक/वापसी मान)

मैं अगर निम्न विधियों का उपयोग करते हैं सत्य हैं:

    वहाँ
  • मैं मूल्य को वापस करने में शामिल महत्वपूर्ण काम होने जा रहा है - यानी: यह एक डीबी से प्राप्त किया जाएगा, या कुछ समय जो "समय"
  • में शामिल हो सकता है, इसमें बहुत कुछ तर्क शामिल है, या तो मूल्य प्राप्त करने या सेट करने में

इसके अलावा, मैं Microsoft's Design Guidelines for Property Usage देखने की सलाह देते चाहते हैं। वे सुझाव देते हैं:

सदस्य एक तार्किक डेटा सदस्य होने पर संपत्ति का उपयोग करें।

  • आपरेशन ऐसे Object.ToString के रूप में एक रूपांतरण, है:

    एक विधि जब प्रयोग करें।

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

मैं जोड़ता हूं कि आपके तरीकों में केवल एक जिम्मेदारी होनी चाहिए। विभिन्न चीजों को करने वाले कोड के इस रीम्स के बड़े पैमाने पर विधियां न बनाएं। प्रत्येक अलग-अलग काम को निजी तरीकों से विभाजित करें या यहां तक ​​कि किसी अन्य वर्ग में विधियों में भी – skyfoot

+0

चिड़ियाघर !! उत्तर दिया और 5 मिनट में 12 अपवॉट मिला। – AnthonyWJones

+0

@ एंथनी WJones: यह होता है जब यह हमेशा एक अच्छा आश्चर्य है :) –

12

यहाँ माइक्रोसॉफ्ट के दिशानिर्देश हैं:

Choosing Between Properties and Methods

  • एक संपत्ति का उपयोग कर यदि सदस्य प्रकार के एक तार्किक विशेषता का प्रतिनिधित्व करता है पर विचार करें।

  • किसी विधि के बजाय संपत्ति का उपयोग करें, यदि संपत्ति का मूल्य प्रक्रिया स्मृति में संग्रहीत किया जाता है और संपत्ति केवल मूल्य तक पहुंच प्रदान करेगी।

  • निम्नलिखित स्थितियों में किसी संपत्ति के बजाय विधि का उपयोग करें।

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

    • ऑपरेशन एक रूपांतरण है, जैसे ऑब्जेक्ट.ToString विधि।

    • ऑपरेशन प्रत्येक बार कॉल होने पर एक अलग परिणाम देता है, भले ही पैरामीटर नहीं बदलते हैं। उदाहरण के लिए, न्यूगूइड विधि प्रत्येक बार कॉल होने पर एक अलग मूल्य देता है।

    • ऑपरेशन का एक महत्वपूर्ण और अवलोकन दुष्प्रभाव है। ध्यान दें कि एक आंतरिक कैश को पॉप्युलेट करना आमतौर पर एक अवलोकन दुष्प्रभाव नहीं माना जाता है।

    • ऑपरेशन एक आंतरिक स्थिति की प्रतिलिपि देता है (इसमें स्टैक पर लौटाए गए मान प्रकार की वस्तुओं की प्रतियां शामिल नहीं होती हैं)।

    • ऑपरेशन एक सरणी देता है।

2

मैं एक संपत्ति का उपयोग कभी नहीं चाहते हैं, तो मैं एक से अधिक क्षेत्र को प्रभावित करने जा सकता है - मैं हमेशा एक विधि का उपयोग करें चाहते हैं।

आम तौर पर, मैं केवल सार्वजनिक स्ट्रिंग त्रुटिLog {get; निजी सेट; } गुणों के लिए वाक्यविन्यास और अन्य सभी चीज़ों के लिए विधियों का उपयोग करें।

2

रीड के जवाब के अतिरिक्त जब संपत्ति केवल इवेंट लॉग जैसी संसाधन प्राप्त करने की तरह गेटर बनने जा रही है। मैं कोशिश करता हूं और केवल गुणों का उपयोग करता हूं जब संपत्ति साइड इफेक्ट मुक्त होगी।

2

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

.NET Framework Design Guidelines पुस्तक है जो इस तरह की सामग्री को बहुत विस्तार से कवर करती है।

4

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

उदाहरण के लिए एक संग्रह में Count संपत्ति हो सकती है। संग्रह ऑब्जेक्ट को मानना ​​उचित है कि वर्तमान में कितनी चीजें हैं, इसके बिना वास्तव में उन्हें लूप करना है और उन्हें गिनना है।

हाथ पर इस hypothetical संग्रह GetSum() विधि हो सकती है जो आयोजित वस्तुओं के सेट को पूरा करता है। संग्रह के बजाय बस एक आसानी से संपत्ति है लेकिन एक विधि का उपयोग करके यह इस विचार को संचारित करता है कि संग्रह को उत्तर पाने के लिए कुछ वास्तविक कार्य करना होगा।

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