2010-05-25 15 views
10
  1. कोई मुझे बता सकता है कि ऑटो-कार्यान्वित गुण C# का उपयोग करने के पीछे क्या विचार है?स्वत: कार्यान्वित गुण C#

    public class Customer 
    { 
        public int ID { get; set; } 
        public string Name { get; set; } 
    } 
    

    मैं प्रेरणा निजी क्षेत्र के लिए गुणों का उपयोग करने के लिए मिलता है, तो हम तय कर सकते हैं कि कैसे एक निजी क्षेत्र का उपयोग कर सकते हैं। लेकिन यहां - यह केवल पहले स्थान से सार्वजनिक होने के लिए फ़ील्ड को परिभाषित करने जैसा है। नहीं?

  2. क्या फ़ील्ड को "सार्वजनिक आधार" होने के लिए परिभाषित करने या इसे केवल एकमात्र संपत्ति रखने के लिए परिभाषित करने में कोई अंतर है?

+1

संभावित डुप्लिकेट [सी #: पूरी तरह सार्वजनिक संपत्ति रखने का क्या मतलब है] (http://stackoverflow.com/questions/2901591/c-what-is-the-point-in-having-a-purely -पublic-संपत्ति) –

+0

और http://stackoverflow.com/questions/1277572, http://stackoverflow.com/questions/1272521, http://stackoverflow.com/questions/1180860 और कई और –

+0

संभावित डुप्लिकेट [सी # 3.0+ में संपत्ति और क्षेत्र के बीच अंतर] (http://stackoverflow.com/questions/653536/difference-between-property-and-field-in-c-sharp-3-0) – nawfal

उत्तर

16

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

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

5

गुण डेटाबेस हो सकते हैं, जबकि फ़ील्ड नहीं हो सकते हैं।

+0

मुझे लगता है, यह है एकमात्र असली कारण है कि उनका आविष्कार क्यों किया गया है ... – SergeyT

2

मैं MSDN यहां बात कर रहे करने देंगे ....

"सी # में 3.0 और बाद में, ऑटो कार्यान्वित गुण संपत्ति-घोषणा अधिक संक्षिप्त कर जब कोई अतिरिक्त तर्क संपत्ति accessors में आवश्यक है। वे ऑब्जेक्ट बनाने के लिए क्लाइंट कोड भी सक्षम करें। जब आप निम्न उदाहरण (उदाहरण के लिए एमएसडीएन आलेख देखें), संकलक एक निजी, अनाम बैकिंग फ़ील्ड बनाता है जिसे केवल संपत्ति के माध्यम से एक्सेस किया जा सकता है और एक्सेसर्स सेट कर सकता है "

शायद सबसे फायदेमंद di वरीयता है कि आप प्री/पोस्ट सत्यापन कर सकते हैं, PropertyChanged इवेंट इत्यादि बढ़ाएं

क्या फ़ील्ड को "सार्वजनिक आधार" होने के लिए परिभाषित करने या इसे केवल एकमात्र संपत्ति रखने के लिए परिभाषित करने में कोई अंतर है?

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

1

2: संकलित समय पर एक सार्वजनिक कॉन्स को परिभाषित किया जाना है, आप इसके लिए संदर्भ ऑब्जेक्ट्स का उपयोग नहीं कर सकते हैं। केवल कक्षाओं कि System.ValueType से विरासत (स्ट्रिंग, पूर्णांक, डबल, ...)

एक स्थिरांक भी स्थिर है, जबकि केवल एक गेटर के साथ एक संपत्ति नहीं है (हर वर्ग यह खुद उदाहरण है है।)

0

1 के बारे में: ऑटो-कार्यान्वित गुणों का उपयोग करने की अनुशंसा की जाती है, क्योंकि आप परिवर्तनों को तोड़ने के बाद बाद में अतिरिक्त तर्क लागू कर सकते हैं। इसके लिए एक उदाहरण Learning about Auto-Implemented Properties

3

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

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

अंतिम बिंदु। यद्यपि आपके मामले में उदाहरण और सार्वजनिक क्षेत्र के बीच थोड़ा कार्यात्मक अंतर है, लेकिन आप एक्सेसर्स में से किसी एक की दृश्यता बदल सकते हैं। तो, एक केवल पढ़ने के लिए संपत्ति एक स्वत: संपत्ति का उपयोग कर बनाने के लिए, आप की तरह कुछ कर सकते हैं:

public int ID { get; private set; } 

इस मामले में, प्राप्त एक्सेसर पूरे हस्ताक्षर के अनुसार, सार्वजनिक है, लेकिन सेट एक्सेसर निजी है।

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