2015-10-20 10 views
6

क्या सी # 6 में गुण आरंभ निम्नलिखित भाव के बीच अंतर है:अंतर 6

1. स्वत: संपत्ति निर्माता

public class Context1 
{ 
    public Context1() 
    { 
     this.Items = new List<string>(); 
    } 

    public List<string> Items { get; private set; } 
} 
से प्रारंभ

2: संपत्ति एक समर्थन क्षेत्र

public class Context2 
{ 
    private readonly List<string> items; 

    public Context2() 
    { 
     this.items = new List<string>(); 
    } 

    public List<string> Items 
    { 
     get 
     { 
      return this.items; 
     } 
    } 
} 
से प्रारंभ

3: सी # में ऑटो-संपदा नई वाक्य रचना 6

public class Context3 
{ 
    public List<string> Items { get; } = new List<string>(); 
} 

4: सी # में ऑटो-संपदा नई वाक्य रचना 6

public class Context4 
{ 
    public List<string> Items => new List<string>(); 
} 

उत्तर

13

लिस्टिंग 3 लिस्टिंग 2 सी # 6 के बराबर है जहां, बैकिंग फील्ड हुड के नीचे प्रदान किया जाता है।

लिस्टिंग 4:

public List<string> Items => new List<string>(); 

के बराबर है:

public List<string> Items { get { return new List<string>(); } } 

जो के रूप में आप कल्पना कर सकते हैं एक नया खाली सूची आप संपत्ति का उपयोग हर बार देता है।

लिस्टिंग के साथ 2/3 और 4 के बीच का अंतर this Q&A में एक उदाहरण के साथ आगे की खोज की गई है।

लिस्टिंग 1 एक गेटर और एक निजी सेटर के साथ सिर्फ एक ऑटो संपत्ति है। यह एक पठनीय संपत्ति नहीं है जिसमें आप इसे कहीं भी सेट कर सकते हैं, आप किसी भी प्रकार के निजी सदस्यों तक पहुंच सकते हैं। एक पठनीय संपत्ति (यानी, एक गेट-केवल संपत्ति) केवल या तो एक कन्स्ट्रक्टर में या संपत्ति घोषणा में शुरू की जा सकती है, जो एक पाठक क्षेत्र की तरह है।

+0

तो 4 नंबर एक लगातार की तरह, लेकिन एक संदर्भ प्रकार के साथ है !? –

+7

यदि "निरंतर" से आपका मतलब है "लगातार इस मान का एक नया उदाहरण लौटाता है" (à la https://xkcd.com/221), तो ... ओह, मुझे ऐसा लगता है। लेकिन यह "स्थिर" का मतलब नहीं है। एक संदर्भ संदर्भ प्रकार है * स्थिरांक नहीं हो सकता है। – BoltClock

+0

नंबर 1 और 2 समान हैं? –

3

ऑटो संपत्तिऑटो कार्यान्वित संपत्ति, जहां डेवलपर को स्पष्ट रूप से समर्थन क्षेत्र घोषित करने के लिए की जरूरत नहीं है के लिए एक छोटी पद है और संकलक एक सेट पर्दे के पीछे।

1. निजी सेटर के साथ स्वत: संपत्ति

public class Context1 
{ 
    public Context1() 
    { 
     this.Items = new List<string>(); 
    } 

    public List<string> Items { get; private set; } 
} 

ऑटो गुण एक्सेसर जिसके लिए पहुँच संपत्ति की पहुँच से अलग है के लिए एक अधिक प्रतिबंधात्मक पहुँच निर्दिष्ट द्वारा सेटर और गेटर के लिए अलग accessibilities हो सकता है।

अन्य उदाहरण हैं:

public string Prop1 { get; private set; } 
public string Prop2 { get; protected set; } 
public string Prop3 { get; internal set; } 
public string Prop4 { protected internal get; set; } 

विभिन्न पहुँच के साथ ये accessors के लिए पहुँचा जा सकता है कहीं भी है कि पहुँच को निर्धारित करता है, न कि केवल निर्माता से।

2।बैकिंग फ़ील्ड

सार्वजनिक वर्ग संदर्भ 2 { निजी रीडोनली सूची आइटम के साथ केवल पढ़ने योग्य संपत्ति;

public Context2() 
{ 
    this.items = new List<string>(); 
} 

public List<string> Items 
{ 
    get { return this.items; } 
} 

} पहले सी # 6, एक रीड ओनली-संपत्ति का मूल्य निर्धारित करने के लिए एक ही रास्ता स्पष्ट रूप से समर्थन क्षेत्र घोषित करने और इसे सीधे सेट करने के लिए किया गया था।

क्योंकि क्षेत्र readonly एक्सेसर है, यह केवल वस्तु के निर्माण के दौरान सेट किया जा सकता।

3. केवल पढ़ने के लिए स्वत: संपत्ति

public class Context3 
{ 
    public List<string> Items { get; } = new List<string>(); 
} 

सी के साथ शुरू # 6, §2 संकलक द्वारा संभाला जा सकता है द्वारा एक समर्थन क्षेत्र है पढ़ने-लिखने की स्वत: संपत्तियों के लिए की तरह उत्पन्न लेकिन , इस मामले में, बैकिंग फ़ील्ड केवल पढ़ने के लिए है और केवल वस्तु के निर्माण के दौरान सेट किया जा सकता है।

4. केवल-पढ़ने के ऑटो-संपदा अभिव्यक्ति शरीर गेटर साथ

public class Context4 
{ 
    public List<string> Items => new List<string>(); 
} 

गुण एक मूल्य, सी # 6 का उपयोग कर गेटर के शरीर घोषित करने के लिए अनुमति देता है कि हर बार इसे पाने के है बदल जाता है जब लैम्ब्डा-जैसे वाक्यविन्यास।

ऊपर कोड इस के बराबर है:

public class Context4 
{ 
    public List<string> Items 
    { 
     get { return new List<string>(); } 
    } 
}