2012-06-01 10 views
9

क्यों सी # के डिजाइनरों ने ऐसा कुछ करने की अनुमति नहीं दी?सी # में कोई घोषणात्मक अपरिवर्तनीयता क्यों नहीं है?

public readonly class ImmutableThing 
{ 
    ... 
} 

सुरक्षित बहु सूत्रण के लिए सबसे महत्वपूर्ण तरीकों में से एक अपरिवर्तनीय वस्तुओं/वर्गों का प्रयोग होता है, फिर भी वहाँ अपरिवर्तनीय के रूप में एक वर्ग घोषित करने के लिए कोई रास्ता नहीं है। मुझे पता है कि मैं इसे उचित कार्यान्वयन से अपरिवर्तनीय बना सकता हूं लेकिन कक्षा घोषणा द्वारा इसे लागू करने से यह इतना आसान और सुरक्षित हो जाएगा। एक वर्ग को अपरिवर्तनीय के रूप में टिप्पणी करना सबसे अच्छा "दरवाजा प्रोप" समाधान है।

कक्षा घोषणा पर एक नज़र डालें और आपको तुरंत पता चलेगा कि यह अपरिवर्तनीय था। अगर आपको किसी और के कोड को संशोधित करना पड़ा तो आपको पता चलेगा कि एक वर्ग इरादे से परिवर्तन की अनुमति नहीं देता है। मैं केवल फायदे देख सकता हूं लेकिन मुझे विश्वास नहीं है कि इससे पहले कोई भी इस बारे में सोचा नहीं था। तो क्यों समर्थित नहीं है?

संपादित

कुछ लोग कहते हैं यह बहुत महत्वपूर्ण विशेषता नहीं है, लेकिन है कि वास्तव में मुझे समझाने नहीं है। मल्टीकोर प्रोसेसर दिखाए गए क्योंकि आवृत्ति द्वारा प्रदर्शन में वृद्धि ने दीवार को मारा। सुपरकंप्यूटर भारी मल्टीप्रोसेसर मशीनें हैं। समांतर प्रसंस्करण अधिक से अधिक महत्वपूर्ण है और प्रदर्शन में सुधार के मुख्य तरीकों में से एक है। .NET में मल्टीथ्रेडिंग और समांतर प्रसंस्करण के लिए समर्थन महत्वपूर्ण है (विभिन्न लॉक प्रकार, थ्रेड पूल, कार्य, एसिंक कॉल, समवर्ती संग्रह, अवरुद्ध संग्रह, समानांतर foreach, PLINQ और इसी तरह) और यह मुझे सबकुछ लगता है जो आपको समानांतर लिखने में मदद करता है कोड आसानी से एक किनारे देता है। भले ही यह लागू करने के लिए तुच्छ नहीं है।

+0

क्योंकि ऐसा नहीं है। हालांकि अच्छा होगा, और यदि वे भाषा को बढ़ाना चाहते हैं तो वे लाइन के नीचे खिड़कियां खोलेंगे। –

+1

क्या यह 'संरचना' नहीं है? (मूल्य semantics के साथ इकाई की तरह एक वर्ग) – FishBasketGordo

+4

@FishBasketGordo, नहीं। –

उत्तर

12

असल में, क्योंकि यह जटिल है - और जैसा कि लिखा है, सुविधाओं को जहाज के लिए तैयार होने से पहले विभिन्न तरीकों से बहुत सारे काम की ज़रूरत है।

यह मुश्किल है - (। मुझे यकीन है कि यह अविश्वसनीय रूप से मुश्किल को वास्तव में यह महत्वपूर्ण कोड ठिकानों जो परिवर्तन से नहीं किया जा सकता के साथ डेवलपर्स के लाखों लोगों के साथ एक भाषा में करते हैं, है कर रहा हूँ यह आसान एक कुर्सी भाषा डिजाइनर किया जा रहा है) एक संकलक के लिए यह सत्यापित करने के लिए कि कुछ मामलों में अत्यधिक प्रकार के प्रतिबंध के बिना एक प्रकार स्पष्ट रूप से अपरिवर्तनीय है। उदाहरण के तौर पर, String वास्तव में mscorlib के भीतर उत्परिवर्तनीय है, लेकिन अन्य प्रकारों का कोड (उदा। StringBuilder) बाहरी दुनिया को कभी भी उस उत्परिवर्तन को देखने से बचने के लिए बहुत सावधानी से लिखा गया है।

एरिक लिपर्ट में written a lot on immutability है - यह एक जटिल विषय है जो एक व्यावहारिक भाषा सुविधा में बदलने के लिए लॉट की आवश्यकता होगी। और फ्रेमवर्क पर रीट्रोफिट करना भी मुश्किल है, जिसके साथ शुरुआत नहीं हुई थी।मुझे कम से कम आसान अपरिवर्तनीय प्रकार लिखने के लिए सी # से प्यार होगा, और मुझे संदेह है कि टीम ने इसके बारे में सोचने में काफी समय बिताया है - चाहे वे कभी भी अपने विचारों के साथ उत्पादन भाषा में बदल सकें सुविधा एक अलग मामला है।

+0

एक अपरिवर्तनीय प्रकार का अर्थ यह नहीं है कि प्रत्येक फ़ील्ड को केवल पढ़ने के लिए घोषित किया जाना चाहिए? यह बहुत जटिल या मुश्किल प्रतीत नहीं होता है, नहीं? –

+3

@ किर्कवॉल: एक प्रकार जिसमें एक पाठक 'स्ट्रिंगबिल्डर' सदस्य है, उतना अपरिवर्तनीय नहीं है जितना कि अधिकांश लोग इसे चाहते हैं। असल में, उत्परिवर्तन वायरल है। –

+0

आह, मैं देखता हूं। मैं नहीं सोच रहा था कि यह गहराई से लागू होगा। –

5

सुविधाओं को डिज़ाइन, कार्यान्वित, परीक्षण, दस्तावेज, तैनात और समर्थित करने की आवश्यकता है। यही कारण है कि हम पहले सबसे महत्वपूर्ण विशेषताओं को प्राप्त करते हैं, और कम महत्वपूर्ण या कभी भी कम महत्वपूर्ण नहीं होते हैं।

आपका प्रस्ताव ठीक है, लेकिन एक आसान कामकाज है (जैसा आपने कहा था)। इसलिए यह एक "जरूरी" सुविधा नहीं है।

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

+1

यह उल्लेख नहीं करना चाहिए कि समस्या यह प्रतीत होने से कहीं अधिक कठिन है, और कठिन समस्याएं आसानी से पक्षियों के पक्ष में वापस आती हैं। –

+0

@MystereMan: मैं यह नहीं कहूंगा, जरूरी है। बहुत सारे छोटे, कम लटकते फल हैं सी # टीम * एसिंक के बजाय * ले जा सकते हैं - जो कि "आसान" समस्या से बहुत दूर है। –

+0

@ जोन्स स्केट - यही कारण है कि मैंने कहा "निविदा"। जब कोई समस्या होती है तो निश्चित रूप से अपवाद होते हैं) बी) उत्पादों की एक बड़ी संख्या के विपणन योजना का हिस्सा और बी) वास्तव में अच्छा;) –

संबंधित मुद्दे