2011-03-05 13 views
13

मैं सी #संपत्ति के साथ और बिना {प्राप्त; सेट; }

के लिए नया क्या

public string MyValue; 

और

public string MyValue { get; set; } 

के बीच अंतर मैं हमेशा मान लिया है कि दोनों एक ही थे हूँ। मेरे कोड में कुछ काम नहीं कर रहा था। बाद के फॉर्म का उपयोग करके यह काम करता है। लेकिन पता नहीं क्या अंतर है। क्या आप मदद कर सकते हैं?

धन्यवाद

+0

की (http [में सी # 3.0+ संपत्ति और फील्ड के बीच अंतर] संभव डुप्लिकेट: // stackoverflow।कॉम/प्रश्न/653536/अंतर-बीच-संपत्ति-और-फ़ील्ड-इन-सी-तेज-3-0) – nawfal

+0

संभावित डुप्लिकेट [फ़ील्ड और सी # में एक संपत्ति के बीच क्या अंतर है?] (http: // stackoverflow.com/questions/295104/what-is-the-difference-between-a-field-and-a-property-in-c) –

उत्तर

20

पहले एक सार्वजनिक क्षेत्र, दूसरा एक स्वचालित रूप से लागू किया सार्वजनिक संपत्ति है।

वे समान नहीं हैं। ऑटो लागू संपत्ति के साथ संकलक एक निजी बैकिंग क्षेत्र उत्पन्न करेगा।

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

9

, तो आप शायद का उपयोग कर रहे डेटा-बाइंडिंग "बाद यह काम किया जाता"; डेटा बाध्यकारी आमतौर पर केवल गुणों (फ़ील्ड नहीं) के विरुद्ध काम करता है। ये स्पष्ट गुण हो सकते हैं, या आपके उदाहरण में स्वचालित रूप से कार्यान्वित गुण हो सकते हैं।

ध्यान दें कि एक क्षेत्र से एक संपत्ति के लिए बदल रहा है, तो आप BinaryFormatter उपयोग कर रहे हैं (जो IMO गहरा वैसे भी त्रुटिपूर्ण) क्रमबद्धता तोड़ सकते हैं, लेकिन गुण हैं बहुत ज्यादा क्षेत्रों से अधिक पसंद। बिल्कुल इस बदलाव को बनाओ; पी

+0

गहराई से विवरण के लिए धन्यवाद। यह वास्तव में आवश्यक था। –

4

वे वास्तव में बहुत अलग संरचनाएं हैं।

string MyData; 

यह एक "क्षेत्र" कहा जाता है:

यह फार्म एक ही रास्ता वास्तव में डेटा के लिए स्मृति को आबंटित करने के लिए है। कुछ इस तरह पर

string MyData { get; set; } 

संकलक इस अनुवाद::

यह फार्म एक "स्वचालित रूप से लागू किया संपत्ति" कहा जाता है

string myDataField; 

string MyData 
{ 
    get { return myDataField; } 
    set { myDataField = value; } 
} 

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

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