यह एक नई सी # 6 सुविधा, "मनुष्य-केवल ऑटो-गुण", के रूप में यह MSDN magazine article 'C# : The New and Improved C# 6.0' by Mark Michaelis में और C# 6.0 draft Language Specification में चर्चा भी "केवल पढ़ने के लिए गुण के लिए ऑटो-संपदा initializers" के रूप में जाना जाता है।
केवल पढ़ने के लिए फ़ील्ड का सेटटर केवल कन्स्ट्रक्टर में ही पहुंच योग्य है, अन्य सभी परिदृश्यों में फ़ील्ड अभी भी पढ़ा जाता है और पहले जैसा व्यवहार करता है।
यह एक सुविधा कोड की राशि है जो आप टाइप करने के लिए और स्पष्ट रूप से एक निजी मॉड्यूल स्तर चर मूल्य धारण करने के लिए घोषित करने के लिए की आवश्यकता को दूर करने की जरूरत है कम करने के लिए वाक्य रचना है।
यह सुविधा सी # 3 में ऑटो-कार्यान्वित गुणों के परिचय के बाद से महत्वपूर्ण दिखाई दे रही थी, म्यूटेबल गुण (गेटटर और सेटर वाले लोग) अपरिवर्तनीय लोगों (केवल एक गेटर वाले) से लिखने के लिए जल्दी हो गए थे। , जिसका अर्थ है कि लोगों को केवल पढ़ने योग्य गुणों के लिए आवश्यक बैकिंग फ़ील्ड के लिए कोड टाइप करने से बचने के लिए म्यूटेबल गुणों का उपयोग करने के लिए लुभाना पड़ रहा था। relevant section of the Microsoft C# Programming Guide में स्वत: कार्यान्वित गुणों की और चर्चा है।
This blog post, '#1,207 – C# 6.0 – Auto-Property Initializers for Read-Only Properties' by Sean Sexton इस प्रकार एक अच्छा विवरण और उदाहरण है:
पहले सी # 6.0 के लिए, यदि आप एक रीड-ओनली (अपरिवर्तनीय) संपत्ति, आप चाहते चाहता था आम तौर पर एक रीड-ओनली समर्थन क्षेत्र का उपयोग करने वाले नीचे दिखाए गए अनुसार कन्स्ट्रक्टर में प्रारंभ किया गया है।
public class Dog
{
public string Name { get; set; }
// DogCreationTime is immutable
private readonly DateTime creTime;
public DateTime DogCreationTime
{
get { return creTime; }
}
public Dog(string name)
{
Name = name;
creTime = DateTime.Now;
}
}
सी # 6.0 में, आप एक केवल पढ़ने के लिए संपत्ति को लागू करने के लिए स्वतः लागू किया गुणों का उपयोग कर सकते हैं। आप इसे ऑटो-प्रॉपर्टी प्रारंभकर्ता का उपयोग करके करते हैं। परिणाम उपर्युक्त उदाहरण की तुलना में अधिक क्लीनर है, जहां हमें स्पष्ट रूप से बैकिंग फ़ील्ड घोषित करना था।
public class Dog
{
public string Name { get; set; }
// DogCreationTime is immutable
public DateTime DogCreationTime { get; } = DateTime.Now;
public Dog(string name)
{
Name = name;
}
}
अधिक जानकारी भी the dotnet Roslyn repo on GitHub में पाया जा सकता:
ऑटो गुण अब एक सेटर बिना घोषित किया जा सकता।
गेटटर-केवल ऑटो-प्रॉपर्टी का बैकिंग फ़ील्ड स्पष्ट रूप से को पढ़ा गया है (हालांकि यह केवल प्रतिबिंब उद्देश्यों के लिए महत्वपूर्ण है)। इसे उपरोक्त उदाहरण में संपत्ति पर प्रारंभकर्ता के माध्यम से प्रारंभ किया जा सकता है। इसके अलावा, एक गेटर-केवल संपत्ति घोषित प्रकार के निर्माता शरीर है, जो अंतर्निहित क्षेत्र के लिए सीधे आवंटित करने के लिए मूल्य का कारण बनता है में करने के लिए आवंटित किया जा सकता है:
यह और अधिक concisely प्रकार व्यक्त के बारे में है, लेकिन यह भी ध्यान दें कि यह म्यूटेबल और अपरिवर्तनीय प्रकारों के बीच की भाषा में एक महत्वपूर्ण अंतर को हटा देता है: ऑटो-गुण केवल एक शॉर्टेंड उपलब्ध थे अगर आप अपनी कक्षा को उत्परिवर्तनीय बनाने के इच्छुक थे, और इसलिए पर प्रलोभन बहुत अच्छा था। अब, गेटर-केवल ऑटो-गुणों के साथ, खेल मैदान परिवर्तनशील और अपरिवर्तनीय के बीच समतल किया गया।
और C# 6.0 draft Language Specification में:
स्वचालित रूप से लागू किया गुण
एक स्वचालित रूप से लागू किया संपत्ति (या संक्षेप में ऑटो-संपत्ति), एक गैर सार गैर निर्वासन संपत्ति के साथ है अर्धविराम-केवल एक्सेसर निकायों। ऑटो-प्रॉपर्टीज में एक्सेसर होना चाहिए और वैकल्पिक रूप से में सेट एक्सेसर हो सकता है।
जब एक संपत्ति एक स्वचालित रूप से लागू किया संपत्ति के रूप में निर्दिष्ट किया जाता है, एक छिपा समर्थन क्षेत्र संपत्ति, के लिए स्वचालित रूप से उपलब्ध है और accessors से पढ़ सकते हैं और है कि समर्थन क्षेत्र के लिए लिखने के लिए लागू किया जाता है। यदि ऑटो-प्रॉपर्टी में कोई सेट एक्सेसर नहीं है, तो बैकिंग फ़ील्ड को केवल पढ़ने के लिए (रीडोनली फ़ील्ड) माना जाता है। एक रीडोनली फ़ील्ड की तरह, संलग्नक वर्ग के निर्माता के शरीर में एक गेट-केवल ऑटो-प्रॉपर्टी भी असाइन की जा सकती है। इस तरह की असाइनमेंट सीधे संपत्ति के रीडोनली बैकिंग फ़ील्ड को असाइन करती है।
एक ऑटो-प्रॉपर्टी के पास वैकल्पिक रूप से एक property_initializer हो सकता है, जो है जो बैकिंग फ़ील्ड पर सीधे variable_initializer (परिवर्तनीय प्रारंभकर्ता) के रूप में लागू होता है।
यह वास्तव में एक सेटर का उपयोग नहीं करता (क्योंकि इसमें कोई नहीं है)। यह सीधे अंतर्निहित क्षेत्र सेट करता है (जो हमसे छिपा हुआ है, यही कारण है कि आपको संपत्ति का नाम उपयोग करने की आवश्यकता है) –
संपत्ति का उपयोग क्या है, यदि यह ** ** ** प्रारंभ नहीं किया जा सकता है/सेट? याकूब मसाद ने इसका उत्तर दिया है – Vikhram