2009-12-09 14 views
5

सरल प्रश्न: क्या एक अमूर्त संपत्ति निजी बैकिंग फ़ील्ड बनाती है? उदाहरण:क्या कोई सार संपत्ति निजी बैकिंग फ़ील्ड बनाती है?

public abstract Name { get; set; } 

क्या यह एक निजी बैकिंग फ़ील्ड बनाएगा? मैं किसी भी वर्ग को मजबूर करना चाहता हूं जो इस संपत्ति को अपने स्वयं के समर्थन क्षेत्र का उपयोग करने के लिए प्राप्त करता है, न कि संकलक द्वारा बनाई गई कोई भी।

उत्तर

7

नहीं, ऐसा नहीं है। मैं सिर्फ निम्नलिखित वर्ग के साथ परीक्षण किया:

public abstract class Class1 
{ 
    public abstract string TestStringAbstract { get; set; } 

    public string TestString { get; set; } 
} 

और Reflector में यह decompiled। यह जेनरेट कोड था:

public abstract class Class1 
{ 
    // Fields 
    [CompilerGenerated] 
    private string <TestString>k__BackingField; 

    // Methods 
    protected Class1() 
    { 
    } 

    // Properties 
    public string TestString 
    { 
     [CompilerGenerated] 
     get 
     { 
      return this.<TestString>k__BackingField; 
     } 
     [CompilerGenerated] 
     set 
     { 
      this.<TestString>k__BackingField = value; 
     } 
    } 

    public abstract string TestStringAbstract { get; set; } 
} 

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

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

दूसरी ओर एक आभासी संपत्ति एक समर्थन क्षेत्र और किसी भी वर्ग है कि एक स्वत: लागू किया प्रतिस्थापन के साथ संपत्ति को ओवरराइड करता है कि वर्ग के स्तर पर अपने स्वयं के समर्थन क्षेत्र पैदा करेगा पैदा करेगा।

+0

धन्यवाद, डिकंपील्ड कोड इसे बहुत स्पष्ट बनाता है। आप रिशेर्पर के साथ ऐसा कैसे करते हैं? –

+0

बस भ्रम से बचने के लिए - यह कोड * resharper * आईएल से पुनर्निर्मित है। यह ** नहीं है ** संकलक उत्पन्न कोड। कंपाइलर आईएल उत्पन्न करता है, सी # नहीं। –

+0

क्षमा करें मेरा मतलब रिशेर्पर नहीं था - मेरा मतलब था * रिफ्लेक्टर * यहां से (http://www.red-gate.com/products/reflector/)। मैंने –

5

नहीं। चूंकि यह सार है, इसलिए कक्षा कार्यान्वयनकर्ता को संपत्ति को लागू करना होगा। यदि कार्यान्वयनकर्ता इसे इस तरह घोषित करता है, तो हां, यह वास्तविक मूल्य रखने के लिए एक छिपे हुए सदस्य के साथ एक स्वचालित संपत्ति है।

3

में अंतर होता है:

public abstract string Name { get; set; } 

और

public string Name { get; set; } 

पहले संपत्ति घोषणा एक समर्थन क्षेत्र पैदा नहीं करता। यह सिर्फ एक अमूर्त संपत्ति बनाता है (एक इंटरफ़ेस विधि घोषणा की तरह), जिसे किसी गैर-अमूर्त विरासत वर्ग द्वारा कार्यान्वित किया जाना है।

दूसरी घोषणा एक ऑटो-प्रॉपर्टी है, जो बैकिंग फ़ील्ड बनाती है। यह वास्तव में संकलक सिंटैक्टिक चीनी शॉर्टेंड है:

private string _name; 
public string Name { get { return _name; } set { _name = value; } } 
संबंधित मुद्दे