सी # भाषा नहीं है, लेकिन .NET ढांचा हो सकता है।
संविदा पुस्तकालय + स्थिर विश्लेषण उपकरण .NET 4 में शुरू किया जा रहा इन परिचय हो सकता है:
माइक्रोसॉफ्ट [अपरिवर्तनीय] उपयोग कर रहा है और [शुद्ध] .NET 3.5 ढांचे के अंदर अभी।
उदाहरण के लिए, System.Core.dll में .NET 3.5 के अंदर [Microsoft.Contracts.Imutable] और [Microsoft.Contracts.Pure] देखें। दुर्भाग्यवश, वे आंतरिक हैं। हालांकि, माइक्रोसॉफ्ट। कॉन्ट्रैक्ट्स। * ज्यादातर स्पेक # अनुसंधान से पैदा हुआ है, और स्पेक # को अनुबंध एपीआई में जोड़ा गया है जो .NET 4.0 का हिस्सा होगा।
हम देखेंगे कि इसमें से क्या आता है। मैंने यह देखने के लिए जांच नहीं की है कि प्री-रिलीज .NET 4.0 बिट्स में अनुबंध एपीआई में [शुद्ध] या [अपरिवर्तनीय] जैसी कोई API शामिल है या नहीं। यदि वे करते हैं, तो मुझे लगता है कि स्थिर विश्लेषण उपकरण संकलक के बजाए नियम को लागू करने वाला होगा।
संपादित करें मैंने इस सप्ताह latest pre-release drop of MS Code Contracts से माइक्रोसॉफ्ट.कंट्राक्ट्स.dll को लोड किया। अच्छी खबर: [शुद्ध] और [व्यवहार्यता (Mutability.Imutable)] लाइब्रेरी में विशेषताएँ मौजूद हैं, जो बताती है कि वे .NET 4.0 में होंगे। वू हू!
संपादित करें 2 अब .NET 4 जारी किया गया है, मैंने इन प्रकारों को देखा। [Pure] अभी भी सिस्टम में है। डायग्नोस्टिक्स। नामस्थान का नियंत्रण करता है। यह सामान्य उपयोग के लिए नहीं है, बल्कि अनुबंध एपीआई के पूर्व और बाद की स्थिति की जांच के उपयोग के लिए है। यह संकलक लागू नहीं है, neither does the Code Contract checker tool enforce purity। [उत्परिवर्तन] चला गया है। दिलचस्प बात यह है कि, जहां माइक्रोसॉफ्ट .NET 3.5 (System.Core.dll में आंतरिक बिगइंटर श्रेणी में) में उत्परिवर्तन और शुद्ध विशेषताओं का उपयोग कर रहा था, .NET 4 ने BigInteger को System.Numerics में स्थानांतरित कर दिया है, और [शुद्ध] और [उत्परिवर्तन] को तोड़ दिया है उस प्रकार से गुण। नीचे पंक्ति: ऐसा प्रतीत होता है .NET 4 साइड इफेक्ट सत्यापन के लिए कुछ भी नहीं करता है।
संपादित के साथ हाल ही में (2011 देर से) 3 पूर्वावलोकन माइक्रोसॉफ्ट Rosyln संकलक-एज-ए-सेवा टूल - माना जाता है कि विजुअल स्टूडियो 2015 में RTM के लिए निर्धारित किए जाने की - देखो की तरह वे समर्थन करने के लिए सक्षम हो जाएगा इस तरह की चीजें; आप शुद्धता और अपरिवर्तनीयता की जांच करने के लिए कंपाइलर में एक्सटेंशन लिख सकते हैं, और उन विशेषताओं के साथ सजाए गए कुछ नियमों का पालन नहीं करते हैं, तो संकलक चेतावनियां जारी करते हैं। फिर भी, हम इसका समर्थन करने के लिए कुछ सालों से बाहर देख रहे हैं।
संपादित करें 4 अब रोज़िलन गर्मी 2015 के रूप में यहां है, शुद्ध/अपरिवर्तनीयता के लिए एक कंपाइलर एक्सटेंशन बनाने की क्षमता वास्तव में मौजूद है। हालांकि, यह मौजूदा फ्रेमवर्क कोड, न ही तृतीय पक्ष लाइब्रेरी कोड के लिए कुछ भी नहीं करता है। लेकिन क्षितिज पर C# 7 proposal for immutable types है। यह संकलक द्वारा लागू किया जाएगा और एनईटी फ्रेमवर्क में एक नया अपरिवर्तनीय कीवर्ड सी # और एक [अपरिवर्तनीय] विशेषता पेश करेगा। उपयोग:
// Edit #4: This is a proposed design for C# 7 immutable as of June 2015.
// Compiler will implicitly mark all fields as readonly.
// Compiler will enforce all fields must be immutable types.
public immutable class Person
{
public Person(string firstName, string lastName, DateTimeOffset birthDay)
{
FirstName = firstName; // Properties can be assigned only in the constructor.
LastName = lastName;
BirthDay = birthDay;
}
public string FirstName { get; } // String is [Immutable], so OK to have as a readonly property
public string LastName { get; }
public DateTime BirthDay { get; } // Date is [Immutable] too.
}
संपादित 5 नवंबर वर्ष 2016 है, और ऐसा लगता है अपरिवर्तनीय प्रकार सी # 7 से हटा दिया गया वहाँ हमेशा आशा है सी # 8. :-)
संपादित 6 नवंबर 2017 है के लिए। सी # 8 पूर्ण दृश्य में आ रहा है, और जब हमारे पास शुद्ध कार्य नहीं होंगे, तो हमारे पास readonly structs होगा। यह एक संरचना अपरिवर्तनीय बनाता है, जो कई संकलक अनुकूलन की अनुमति देता है।
इस सप्ताह की प्रीरलीज ड्रॉप के रूप में एक और नोट, [शुद्ध] सार्वजनिक है, लेकिन [उत्परिवर्तन (...)] आंतरिक है। हम देखेंगे कि यह परिवर्तन है या नहीं। –
ध्यान देने योग्य एक और बात यह है कि क्या ये गुण सामान्य उपयोग के लिए हैं, या यदि वे केवल अनुबंध एपीआई में उपयोग के लिए हैं। मुझे आशा है कि वे आमतौर पर कोडबेस के दौरान उपयोग किए जाने के लिए उपयोगी होते हैं, भले ही कोई वास्तविक सिस्टम का उपयोग कर रहा हो। डायग्नोस्टिक्स.कॉन्टर एपीआई। –
+1 जब दुनिया बदल गया तो एक प्राचीन प्रश्न का उत्तर अपडेट करने के लिए +1। उत्तर को अपडेट करने के लिए – Emile