2009-12-24 11 views
6

मुझे लगता है कि यह .net 2.0 में था, माइक्रोसॉफ्ट एक्सेसर किलोक एक्सेसर .net

public string Name { get; set; }

की तरह कुछ करने के लिए संक्षिप्त किया गया था लेकिन वहाँ से ऊपर कोड के बीच कोई वास्तविक अंतर है शुरू की, और बस:

public string Name; 
+1

आप इसे पढ़ना चाहेंगे: http://stackoverflow.com/questions/1019571/why-do-we-use-net-properties-instead-of-plain-old-get-set-functions –

+1

http: //stackoverflow.com/questions/1272521/propertywith-no-extra-processing-vs-public-field – Groo

+1

यह एसी # 3.0 फीचर (.NET 3.5) सटीक होने के लिए –

उत्तर

6

मुख्य अंतर यह है कि अगर आप बाद में अपने गेटर या सेटर, और अन्य DLLs में तर्क जोड़ने की जरूरत पहले से ही तुम्हारा के खिलाफ संकलित किया गया है, तो आप आसानी

public string Name { get; set; } 

public string Name { get{/*special code*/} set{/*special code*/} } 
में बदल सकते हैं

और यह आपके नए डीएलएल को प्रकाशित करने के लिए एक तोड़ने वाला बदलाव नहीं होगा और अन्य डीएलएल को पुन: संकलित नहीं किया जाएगा।


जबकि यदि आप

public string Name { get{/*special code*/} set{/*special code*/} } 

में

public string Name; 

बदल तो आप के बाद से वे में एक क्षेत्र तक पहुँचने से बदल यकीन है कि किसी भी DLLs कि तुम्हारा उपयोग करते हैं, recompiled हैं बनाने की आवश्यकता होगी एक संपत्ति का उपयोग

यह स्पष्ट रूप से एक बड़ा समस्या जब आप अन्य प्रोग्रामर से DLLs शिपिंग रहे हैं (एक खुला स्रोत परियोजना के रूप में या उदाहरण के लिए एक घटक विक्रेता के रूप में) है तो आप बस अपने स्वयं/नियोक्ता के लिए एक ऐप का निर्माण कर रहे हैं की तुलना में

+0

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

+0

क्योंकि MSIL में, संपत्ति पहुंच एक विधि कॉल की एक विशेष प्रकार का है, जबकि एक क्षेत्र का उपयोग सिर्फ एक क्षेत्र का उपयोग कर सकते है। –

+2

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

4

अंतर एक Field और एक Property के बीच है। एक वर्ग वर्ग उदाहरण पर सिर्फ एक सदस्य चर है। इसके विपरीत, एक संपत्ति दो अलग-अलग कार्यों के लिए आशुलिपि है - हो और सेट:

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

private string _name; 

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

set 
{ 
    this.InvokePropertyChangedEvent(); 
    _name = value; 
} 

सटीक सिंटैक्स आप के बारे में पूछ रहे हैं: प्रोग्राम प्रवाह कुछ हर बार एक क्षेत्र का मान सेट (जैसे, एक घटना निकाल दिया जाता है) हो की आवश्यकता है, यह संपत्ति के सेटर से निकाल दिया जा सकता है Auto-Implemented Properties कहा जाता है, जो ऊपर दिए गए सरल उदाहरण के लिए सिर्फ लघुरूप है। कंपाइलर एक निजी सदस्य बनाता है जो संपत्ति द्वारा प्राप्त और सेट किया जाता है।

+1

@Rex: लेकिन सवाल यह नहीं है कि सवाल में क्या पूछा गया है। प्रश्न दोनों घोषणाओं के बीच अंतर और फील्ड और संपत्ति के बीच के अंतर के बारे में नहीं है। –

+0

@ दो घोषणाओं के बीच अंतर का एक पूर्ण स्पष्टीकरण पृष्ठभूमि जानकारी की आवश्यकता है जिसे हम पहले से ही ओपी नहीं मान सकते हैं। आप जो खोज रहे हैं वह अंत में नीचे है। –

+0

मैं अपने जवाब में घटनाओं को बढ़ाने के बारे में लिखना चाहता था लेकिन फिर यह सवाल नहीं है। –

4

स्वचालित गुण पहली बार सी # 3.0 में पेश किए गए थे। के बीच अंतर:

public string Name { get; set; } 

और

public string Name; 

है कि पहले एक property जबकि दूसरा एक field वाणी है। ओओपी गुणों में खेतों को समाहित करने के लिए उपयोग किया जाता है। एक संपत्ति में setter या getter या दोनों हो सकते हैं और आप प्रत्येक के लिए अलग-अलग पहुंच स्तर भी निर्दिष्ट कर सकते हैं।

1

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

इसके अलावा, यदि आप प्रतिबिंब का उपयोग करते हैं, तो आपको पहले उदाहरण लाइन के लिए प्रॉपर्टी सेटर और गेटटर की तलाश करनी होगी और दूसरे के लिए आपको सीधे सदस्य चर को पुनर्प्राप्त करने की आवश्यकता होगी।

आमतौर पर, गुणों का उपयोग करना बहुत बेहतर डिज़ाइन है।

2

शॉर्टेंड संपत्ति घोषणा के बीच का अंतर यह है कि आप इसे इस तरह परिभाषित कर सकते हैं।

public string Name { get; private set; } 

इसका मतलब है कि संपत्ति सार्वजनिक रूप से पढ़ी जा सकती है लेकिन केवल निजी सदस्य ही इसमें लिख सकते हैं। आप एक क्षेत्र के लिए ऐसी चीज नहीं कर सकते हैं।

आप शॉर्ट हाथ संपत्ति घोषणाओं के उत्पन्न आईएल को देखें, तो आप पाएंगे कि संकलक एक संपत्ति को /स्वत: जनरेट की सदस्य-क्षेत्रों से जोड़ा गया है पढ़ने के लिए या में लिखेंगे।

+0

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

2

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

0

संपत्तिग्रस्त उपयोगकर्ताओं के लिए एक उपयोगी अंतर यह था कि सार्वजनिक स्ट्रिंग नाम {प्राप्त करें; सेट; } हम आसानी से Propertygrid में स्रोत डेटा सेट कर सकते हैं।

सार्वजनिक स्ट्रिंग नाम घोषित करते समय; प्रॉपर्टीग्रीड के लिए का उपयोग नहीं किया जाएगा।

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