2011-09-15 16 views
13

हाय दोस्तों नीचे कोड के दो टुकड़ों के बीच कोई अंतर है? या शीर्ष नीचे एक छोटा सा शीर्ष है?प्रोप और पूर्ण संपत्ति के बीच अंतर क्या है?

public string Name{get;set;} 

और

private string _Name; 
     public string Name 
     { 
      get { return _Name; } 
      set { _Name=value; } 
     } 
+0

ऑटो संपत्तियों के लिए MSDN लेख से "... संकलक एक निजी, अनाम समर्थन क्षेत्र है कि केवल संपत्ति के प्राप्त के माध्यम से पहुँचा जा सकता है और सेट accessors बनाता है" - http://msdn.microsoft.com/en- हमें/पुस्तकालय/bb384054.aspx –

उत्तर

9

एकमात्र अंतर (तथ्य यह है कि आपको अपने वर्ग कन्स्ट्रक्टर में "डिफ़ॉल्ट नाम" के साथ प्रारंभ करना होगा) यह है कि _नाम कक्षा के भीतर ही दिखाई देगा। एक जोखिम है कि कक्षा आंतरिक रूप से नाम के बजाय _Name का संदर्भ देगी, सब कुछ ठीक काम करेगा, और कुछ समय बाद आप नाम पर कुछ तर्क जोड़ देंगे जिन्हें कॉल नहीं किया जाएगा क्योंकि आप कक्षा के भीतर _नाम का उपयोग कर रहे हैं।

उदाहरण:

private string _Name = "Default Name"; 
public string Name 
{ 
    get { return _Name.Left(42); } // Changed the getter 
    set { _Name = value; } 
} 

void MyOtherMethod() 
{ 
    string foo = _Name; // Referencing the private field accidentally instead of the public property. 
    // Do something with foo 
} 
1

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

3

मुझे नहीं लगता कि संकलित कोड में कोई अंतर है। यद्यपि आप पूर्ण तरीके से ऐसा करना चाहते हैं, भले ही आप डिफॉल्ट वैल्यू (जो शॉर्ट हैंड फॉर्म में कन्स्ट्रक्टर में किया जा सकता है) जोड़ना चाहते हैं, या गेटर या सेटर

संपादित करें: वास्तव में, अपने कोड गलत है यह

private string _Name; 
public string Name 
{ 
    get { return _Name; } 
    set { _Name = value; }//change here 
} 

नहीं ...

value = _Name; 
1

दूसरा रूप के इस विशेष कार्यान्वयन के लिए होना चाहिए, दोनों बराबर हैं। क्योंकि यदि आप केवल पहला फॉर्म लिखते हैं तो संकलक लगभग उसी कोड उत्पन्न करेगा। यह इस तरह दिखना बनाने

public string Name{get;set;} 

:

है, संकलक इसे करने के लिए कोड जोड़ने के लिए जा रहा है

private string generatedCode_Name; 
public string Name 
{ 
     get { return generatedCode_Name; } 
     set { generatedCode_Name = value; } 
} 

वैसे, यह गलत है

set { value = _Name; } //I believe its a typo! 

मुझे लगता है कि आपका मतलब था:

set { _Name = value; } 
1

एक अंतर यह आप निजी स्ट्रिंग पर एक डिफ़ॉल्ट सेट कर सकते हैं कि जब आप इस

private string _Name = "Default Name"; 
public string Name 
{ 
    get { return _Name; } 
    set { value = _Name; } 
} 

एक बार कर संकलित दो उदाहरण आप से पता चला समान हैं।

0

उदाहरण के रूप में लिखा है कि वे एक सटीक बराबर हैं के लिए।

Auto-implemented properties सिंटैक्टिक चीनी वास्तव में इस प्रकार की स्थिति को संबोधित करने के लिए पेश किया गया है, जहां संपत्ति का उपयोग सार्वजनिक क्षेत्र से बचने के लिए किया जाता है, जिसमें गेटर/सेटर में कोई अतिरिक्त तर्क नहीं होता है। हालांकि, एक स्वत: कार्यान्वित संपत्ति आपको मेटाडेटा समेत गुणों के सभी लाभ प्रदान करती है।यहां एक old but still relevant link है जो उनके बारे में थोड़ा और बताता है।

परदे के पीछे, संकलक बहुत अपने खुद के लिए इसी तरह की एक समर्थन क्षेत्र उत्पन्न करता है।

3

बेसिक व्यवहार और संपत्ति विधि के दोनों के प्रयोजन के लगभग एक ही है। लेकिन कार्यान्वयन में प्रमुख अंतर है।

public string Name{get;set;} 

और

private string _Name; 
     public string Name 
     { 
      get { return _Name; } 
      set { _Name=value; } 
     } 

के बीच का अंतर है, तो आप कम संपत्ति वाक्य रचना (ढांचा 3.0 या बाद में शुरू की गई) का उपयोग है, तो संपत्ति डंक यानी प्रारंभ नहीं किया जाता है, तो आप सीधे का उपयोग "नाम" संपत्ति मूल्य को सेट किए बिना कहीं भी, यह एक पूर्ण मूल्य वापस कर देगा। लेकिन यदि आप संपत्ति मान को प्रारंभ करने के लिए दूसरे वाक्यविन्यास का उपयोग करते हैं, तो यह एक ईएमपीटीई स्ट्रिंग लौटाएगा क्योंकि जब आप स्ट्रिंग को प्रारंभ करते हैं, तो इसे एक ईएमपीटीई वैल्यू के साथ प्रारंभ किया जाता है जो न्यूल नहीं है। इसलिए यदि आप पूर्ण संपत्ति विधि का उपयोग शुरू किए बिना संपत्ति मूल्य वापस कर देते हैं, तो यह हमेशा EMPTY स्ट्रिंग को पूर्ण मान नहीं देगा।

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