2012-03-10 8 views
11

मुझे पता है कि ऑटो-प्रॉपर्टी का उपयोग करते समय, कंपाइलर स्क्रीन के पीछे अपना बैकिंग फ़ील्ड बनाता है। हालांकि, कई कार्यक्रमों में मैं स्पष्ट रूप से लिखनेऑटो-प्रॉपर्टी के साथ या बिना बैकिंग फ़ील्ड - वरीयता?

private int _backingField; 

public int Property { get { return _backingField; } } 

क्या बीच का अंतर से ऊपर है, और नीचे से, मैं लोगों को देखने को जानने के लिए पढ़ा है?

public int Property { get; private set; } 

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

एकमात्र अंतर जो मैंने पाया है वह यह है कि मूल्य को कॉल करने का तरीका उस वर्ग के अंदर अलग है जिसमें यह परिभाषित किया गया है। क्या यह सरल प्राथमिकता है, या इसकी संपत्ति के माध्यम से मूल्य को कॉल करने के लिए कुछ और है या सीधे क्षेत्र तक पहुंच कर? सरल सम्मेलन?

उत्तर

14

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

private readonly int _backingField;  
public int Property { get { return _backingField; } } 

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

यह, बल्कि भ्रामक है जिस तरह से:

इसके अलावा, मैं समझता हूँ कि आप स्पष्ट रूप से structs के मामले में समर्थन क्षेत्र का उपयोग करने के लिए, आप गुण के माध्यम से अपने सदस्यों तक नहीं पहुँच सकता है।

आपका क्या मतलब है? आप निश्चित रूप से structs के भीतर गुणों का उपयोग कर सकते हैं। आप, खेतों जो परिवर्तनशील structs हैं लेने के बारे में बात कर रहे हैं अर्थात के बीच अंतर:

foo.someField.X = 10; 

और

foo.SomeProperty.X = 10; 

? यदि ऐसा है, तो मैं आम तौर पर इससे बचने के लिए अपने structs को अपरिवर्तनीय बनाकर एक समस्या होने से बचता हूं :)

+1

उदाहरण के रूप में XNA के वेक्टर 2 का उपयोग करके, यदि मैं सार्वजनिक वेक्टर 2 वेक्टर {प्राप्त करता हूं; सेट; } मैं TheVector.X = 10 पर कॉल नहीं कर सकता; इसके बजाय, मुझे वास्तविक फ़ील्ड का उपयोग करना होगा। मूल्य/संदर्भ से गुज़रने के बारे में कुछ। (क्या आपके पास कुछ पढ़ने वाली सामग्री है जो सी # के लिए मान/संदर्भ के आधार पर गुजरती है, एक sidenote के रूप में?) – Taelia

+0

इसके अलावा, अगर मेरे दो उदाहरणों के बीच वास्तव में कोई अंतर नहीं है, तो अभी भी बहुत से लोग स्पष्ट रूप से बैकिंग फ़ील्ड क्यों बनाते हैं (असली के बिना उद्देश्य)? – Taelia

+0

@ टेलिया: ठीक है, यह एक परिवर्तनीय संरचना का मामला है - जिसे मैं आम तौर पर टालता हूं। ऐसा इसलिए है क्योंकि संपत्ति मूल्य की प्रतिलिपि देता है। और मैं अन्य लोगों के लिए कारण देने का प्रयास नहीं करने जा रहा हूं। –