2008-10-31 12 views
18

मैं एक संपत्तिरीडोनली गुण छंद कार्यों का उपयोग करना बेहतर क्यों है?

public readonly property foo as string 
    get 
    return bar 
    end get 
end property 

या एक समारोह

public function foo() as string 
    return bar 
end function 

क्यों मैं एक दूसरे के ऊपर प्रपत्र का उपयोग करना चाहते हैं का उपयोग कर के बीच थोड़ा कार्यात्मक अंतर देखते हैं?

धन्यवाद!

उत्तर

15

मैंने हाल ही में विजुअल स्टूडियो पत्रिका में एक दिलचस्प लेख पढ़ा जिसने विधि और गुणों के बीच अलग-अलग चर्चा की।

गुणों को प्रत्येक बार एक मूल्य और एक ही मूल्य वापस करने के लिए माना जाता है जब तक कि बीच में कुछ और नहीं कहा जाता है।

दूसरी तरफ एक विधि पृष्ठभूमि प्राप्त करने के लिए पृष्ठभूमि में कुछ करने की अपेक्षा की जाती है, या यह विधि हर बार मूल्य को बदल सकती है जैसे GetNextId() या कुछ।

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

यहाँ interested- उन लोगों के लिए लेख

Choose Between Methods and Properties

+1

यह एक दिलचस्प व्यवहारिक अंतर है जिसे किसी अन्य भाषा में कीवर्ड कॉन्स्ट का उपयोग करके पहचाना जा सकता है। ऐसा लगता है कि धर्म के छिपाने के लिए "माना" और "चाहिए" स्थान हैं। एक स्पष्ट परिभाषा सम्मेलनों के बजाय मानकों के लिए अनुमति देता है। –

+1

'डेटटाइम.अब' एक संपत्ति के रूप में उत्कृष्ट है। यद्यपि इसका मूल्य हर समय बदलता है, इसका कोई प्रभाव नहीं पड़ता है (चूंकि 'डेटटाइम अपरिवर्तनीय है और संपत्ति साझा की जाती है!) और यह भी कॉलिंग (काउंटर या यादृच्छिक संख्या की तरह) पर निर्भर नहीं है लेकिन कार्यक्रम के बाहर किसी अन्य संस्करण पर –

+0

अरे, मुझे इसके लिए वोट मत देना - लेख लिखने वाले व्यक्ति को ढूंढें। इसके अलावा, एक संपत्ति को खुद को नहीं बदला जाना चाहिए - अगर ऐसा होता है, तो यह संपत्ति नहीं है ... यह एक विधि है – Hugoware

9

यह पूरी तरह से उपस्थिति का मामला है। तरीके से कार्रवाई करने का तरीका है, जबकि गुण कुछ डेटा प्राप्त करने का संकेत देते हैं।

+0

उस परिप्रेक्ष्य से आप तर्क दे सकते हैं कि गुण प्राप्त करने के लिए होस्ट ऑब्जेक्ट का एक आधार होना चाहिए। –

+0

@DrFloyd: सच है, वास्तव में मैंने कहा होगा कि अगर मैंने वाक्यांश के लिए एक अच्छा तरीका सोचा था। –

1

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

परिणामस्वरूप, सुनिश्चित करें कि गुणों के मूल्य कुछ बाहरी कार्रवाई के बिना नहीं बदलते हैं क्योंकि अन्यथा, डीबगर आपके प्रोग्राम को खराब कर देगा।

1

जहां तक ​​मुझे पता है, यह सब एक ही चीज़ के लिए संकलित करता है। आईएल के लिए आईएल में एक संपत्ति वास्तव में सिर्फ एक getPropertyName और SetPropertyName फ़ंक्शन प्रॉपर्टीनाम नामक संपत्ति के लिए है।

तो यह वास्तव में उस संबंध में शैली का मामला है। एक तरह से, अपने वास्तव में कोड सौंदर्यशास्त्र के एक मामले में

person.Address.Street; 

बजाय

person.Address().Street(); 

तो,: यह सिर्फ निम्नलिखित को देखने के लिए बेहतर पढ़ता है।

दुर्भाग्यवश मेरे लिए में .NET सी #, () में रुबी के रूप में सुरुचिपूर्ण नहीं है हमेशा वैकल्पिक हैं।

+3

वीबी.Net हमेशा(), सी # – Nescio

+0

की आवश्यकता नहीं है, ठीक है, यह एक ही चीज़ पर * नहीं * नीचे संकलित करता है, जैसा आपने स्वयं कहा था। कंपाइलर दोनों के बीच मतभेदों से अच्छी तरह से अवगत है और उन्हें बहुत अलग तरीके से इलाज कर सकता है। अच्छे कारण के लिए –

+0

सी # की आवश्यकता है()। कोष्ठक के बिना, इसका मतलब कुछ अलग है। देखें: प्रतिनिधि। –

2

मेरी समझ में, आप तरीकों की DataBind नहीं कर सकता है, केवल गुण इस प्रकार संपत्तियों में अतिरिक्त लाभ होता है।

+2

आप विधियों के लिए डेटाबेस नहीं कर सकते क्योंकि इसे डेटाबेस कहा जाता है , actionbind नहीं। आईएमओ गुण = डेटा, विधियों = कार्यों। –

1

यदि आप स्वयं फ्रेमवर्क डिज़ाइन दिशानिर्देशों पर आधारित हैं, तो आपको केवल एक विधि का उपयोग करना होगा जब आप वास्तव में कोई कार्रवाई कर रहे हों या resouces का उपयोग कर रहे हों जो उपयोग करने के लिए महंगा हो सकता है (डेटाबेस, नेटवर्क)।

संपत्ति उपयोगकर्ता को यह इंप्रेशन देती है कि मान स्मृति में संग्रहीत होते हैं और एक विधि को कॉल करते समय संपत्ति को पढ़ना तेज़ होता है, केवल "मूल्य प्राप्त करने" से अधिक प्रभाव पड़ सकता है।

ब्रैड अब्राम ने वास्तव में इसके बारे में article लिखा और एमएसडीएन here पर भी पोस्ट किया गया है।

मैं अत्यधिक सुझाव देता हूं कि आप Framework Design Guidelines पुस्तक खरीद लेंगे। यह प्रत्येक डेवलपर के लिए एक पढ़ा जाना चाहिए।

0

मेरा विचार यह है कि यदि आप "विधि" की तुलना में "संपत्ति" शब्द देखते हैं। "संपत्ति" शब्द का तात्पर्य है "यह वस्तु, रंग, आकार, मालिक जैसे वस्तु में अंतर्निहित कुछ मूल्य है ... एक संपत्ति को कॉल करने से उस मूल्य को वापस करने के लिए अपेक्षाकृत सरल ऑपरेशन होगा। या, यदि यह केवल पढ़ने के लिए नहीं है संपत्ति, संपत्ति की स्थापना करना अपेक्षाकृत सरल (और कम लागत) ऑपरेशन होना चाहिए।

दूसरी तरफ, "विधि" का तात्पर्य है "मुझे यह कार्य करने के लिए कुछ वास्तविक काम करना है जो आप मुझसे पूछ रहे हैं "- जबकि एक विधि अच्छी तरह से एक मूल्य वापस कर सकती है (भले ही केवल" हाँ, मैंने ऐसा किया "कहें), यह मेरे लिए यह मूल्य प्राप्त करने के लिए सामान का पूरा समूह कर रहा है - और ऐसा करने में, यह कुछ और करेगा उस मान को प्राप्त करने के साथ जुड़े संचालन।

तो, यह मुख्य रूप से अर्थपूर्ण है - केवल पढ़ने की संपत्ति ही संतोषजनक ढंग से एक विधि के रूप में लागू की जा सकती है - लेकिन मैं देखता हूं कि उस मूल्य को वापस करने में क्या शामिल है, और प्रत्येक उस व्यक्ति को उस संपत्ति को पुनर्प्राप्त करने या उस विधि को कॉल करने वाले व्यक्ति को भेजे गए प्रभाव।

1

फ़ंक्शन पर रीडऑनली प्रॉपर्टी चुनने का एक कारण यह है कि रनटाइम डीबगिंग के दौरान संपत्ति मूल्यों को आसानी से देखा जा सकता है। फ़ंक्शन को कॉल किए बिना आपको फ़ंक्शन परिणाम नहीं मिल सकता है।

ऑपरेशन महंगा है और यदि संपत्ति पर कोई फ़ंक्शन चुनना है तो यह उचित है। लेकिन यदि ऐसा नहीं है, तो गुणों को चुनने से डीबगिंग सत्र के दौरान ऑब्जेक्ट के साथ काम करना थोड़ा आसान हो जाता है।

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