2011-09-06 16 views
8

संभव डुप्लिकेट के बिना संपत्ति के बीच अंतर:
What's the difference between encapsulating a private member as a property and defining a property without a private member?सी #, चर के साथ और चर

मैं संपत्तियों की बुनियादी कार्यक्षमता पता है। लेकिन जैसा कि मैं गहराई से दस्तावेज़ीकरण के माध्यम से जाता हूं, मुझे लगता है कि उन्हें केवल सेट के साथ और चर के बिना घोषित किया जाता है।

क्या इन दो

public int EmpCode 
{ 
    get { return _strEmpCode; } 
    set { _strEmpCode = value; } 
} 

और

public int EmpCode 
{ 
    get; 
    set; 
} 

के बीच diffeence यह सिर्फ लेखन के एक आसान तरीका है जो के रूप में .net चौखटे अपग्रेड किया गया है मिल गया है है। या कोई कार्यात्मक अंतर है?

उत्तर

6

बाद में एक स्वत: संपत्ति को फोन किया और same.They # 3 सी में पेश किए गए है है, तो आप उनके बारे में अधिक यहाँ पढ़ सकते हैं: http://trashvin.blogspot.com/2008/05/automatic-properties-and-object.html

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

+0

क्या सभी डेटा प्रकारों के लिए यह शॉर्टेंड है? –

+0

@ नीतेश हेबरी - वास्तव में यह है। –

+0

इसमें नेट फ्रेमवर्क 3.5 शामिल है? –

3

इसे स्वचालित संपत्ति कहा जाता है। कोई कार्यात्मक अंतर नहीं है। उत्तरार्द्ध वाक्यविन्यास सिर्फ पूर्व का एक शॉर्टेंड है।

C# specification की धारा 10.7.3 और अधिक विस्तार देता है:

जब एक संपत्ति एक स्वचालित रूप से लागू किया संपत्ति के रूप में निर्दिष्ट किया जाता है, एक छिपा समर्थन क्षेत्र संपत्ति के लिए स्वचालित रूप से उपलब्ध है, और accessors पढ़ने के लिए लागू किया जाता है उस बैकिंग फ़ील्ड से और लिखो।

निम्न उदाहरण:

public class Point { 
    public int X { get; set; } // automatically implemented 
    public int Y { get; set; } // automatically implemented 
} 

निम्नलिखित घोषणा के बराबर है:

public class Point { 
    private int x; 
    private int y; 
    public int X { get { return x; } set { x = value; } } 
    public int Y { get { return y; } set { y = value; } } 
} 
+1

कोई कार्यात्मक अंतर नहीं है, हालांकि यदि आप ऑटो प्रोप को क्रमबद्ध करने जा रहे हैं तो आपको बैकिंग फ़ील्ड के लिए भ्रमित नाम मिलेंगे, जो बेहद परेशान हो सकते हैं – vittore

0

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

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

+0

क्या यह शॉर्टेंड लागू सभी डेटा प्रकारों के लिए है? –

+0

@ नीतेश हेबरी - वास्तव में यह है। –

0

इस तरह के रूप में कोई कार्यात्मक अंतर नहीं है .. लेकिन अगर आप अपनी संपत्ति की स्थापना के बारे में अधिक कार्यक्षमता चाहते हैं/आप निजी चर के साथ संस्करण का उपयोग कर सकते हो रही है ..

public int EmpCode 
    { 
     get { return _strEmpCode > 0 ? 100 + _strEmpCode : 0; } 
     set 
     { 
      if (value > 0) 
       _strEmpCode = value; 
     } 
    } 

अन्यथा आप बस संस्करण का उपयोग कर सकते हैं निजी चर के बिना।

0

दूसरा तरीका वास्तव में ऑटो-प्रॉपर्टी है जो पूर्ण रूप से बैकिंग फ़ील्ड को लागू करता है, जिसका अर्थ है कि आप जेनरेट किए गए फ़ील्ड नाम को प्रभावित नहीं कर सकते हैं।

अधिकांश समय जब आप परवाह नहीं करते हैं, हालाँकि जब आप धारावाहिक/deserializing का उपयोग कर परतों के बीच वस्तुओं को पारित करते हैं, तो आप कुछ मामलों में __propBackingField2735t34 से छुटकारा पाने के लिए स्पष्ट रूप से बैकिंग फ़ील्ड बनाएंगे, ग्राहक।

भी स्पष्ट रूप से कोडित गुण में सत्यापन के लिए कुछ तर्क शामिल किया जा सकता है, जो एक निजी समर्थन क्षेत्र स्वचालित रूप से द्वारा बनाई गई है autoproperites

0

यह सी # 3.0 से वृद्धि जो ऑटो कार्यान्वित गुण के रूप में कहा जाता है के लिए मामला नहीं है पृष्ठभूमि में संकलक

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