अन्य अच्छे उत्तरों के अलावा, मैं अभी तक एक और कारण जोड़ूंगा कि C # में C- स्टाइल की कमी नहीं डाली जाए। तुमने कहा था:
हम पैरामीटर को कब्ज के रूप में चिह्नित करते हैं ताकि यह सुनिश्चित हो सके कि इसकी स्थिति को विधि में नहीं बदला जाएगा।
अगर वास्तव में कास्ट ने ऐसा किया, तो यह बहुत अच्छा होगा। कास्ट ऐसा नहीं करता है। कास्ट एक झूठ है!
कॉन्स्ट कोई गारंटी नहीं देता है कि मैं वास्तव में उपयोग कर सकता हूं। मान लीजिए आपके पास एक तरीका है जो एक कास्ट चीज़ लेता है। दो कोड लेखक हैं: कॉल करने वाले व्यक्ति और कैली लिखने वाले व्यक्ति । कैली के लेखक ने विधि को एक आधार बना लिया है। वस्तु के बारे में दो लेखक क्या मान सकते हैं?
कुछ भी तो नहीं। कैली स्वतंत्र रूप से कास्ट को हटाने और ऑब्जेक्ट को म्यूट करने के लिए स्वतंत्र है, इसलिए कॉलर को कोई गारंटी नहीं है कि एक विधि को कॉल करना जो वास्तव में एक कॉस्ट लेता है वह इसे म्यूट नहीं करेगा। इसी तरह, कैली मान नहीं सकते हैं कि ऑब्जेक्ट की सामग्री कैली की कार्रवाई के दौरान नहीं बदलेगी; कैलली , कॉन्सट ऑब्जेक्ट के नॉन कॉस्ट एलियास पर कुछ उत्परिवर्तन विधि कह सकता है , और अब तथाकथित कॉन्स ऑब्जेक्ट बदल गया है ।
सी-स्टाइल कास्ट कोई गारंटी नहीं देता है कि ऑब्जेक्ट नहीं बदलेगा, और इसलिए टूट गया है। अब, सी में पहले से ही एक कमजोर प्रकार की प्रणाली है जिसमें आप एक डबल का एक पुनर्व्याख्या कलाकारों को एक इंट में कर सकते हैं यदि आप वास्तव में चाहते हैं, तो यह आश्चर्य की बात नहीं होनी चाहिए कि इसमें कमजोर प्रकार की प्रणाली के साथ-साथ सम्मान भी है। लेकिन C # को एक अच्छी प्रकार की प्रणाली के लिए डिज़ाइन किया गया था , एक प्रकार की प्रणाली जहां आप कहते हैं कि "इस चर में एक स्ट्रिंग है" जिसमें चर वास्तव में एक स्ट्रिंग (या अशक्त) का संदर्भ होता है । हम बिल्कुल सी-स्टाइल "कॉन्स्ट" संशोधक को टाइप सिस्टम में नहीं डालना चाहते हैं क्योंकि हम नहीं चाहते हैं कि टाइप सिस्टम झूठ हो । हम चाहते हैं कि प्रकार प्रणाली मजबूत हो ताकि आप अपने कोड के बारे में सही तरीके से समझ सकें ।
सी में कास्ट एक दिशानिर्देश है ; इसका मूल रूप से मतलब है "आप इस बात को म्यूट करने की कोशिश न करने के लिए मुझ पर भरोसा कर सकते हैं"। यह प्रकार प्रणाली में नहीं होना चाहिए ; प्रकार प्रणाली में सामान उस वस्तु के बारे में एक तथ्य होना चाहिए जिसके बारे में आप तर्क कर सकते हैं, इसके उपयोग के लिए दिशानिर्देश नहीं ।
अब, मुझे गलत मत समझो; सिर्फ इसलिए कि सी में कास्ट गहराई से टूटी हुई है, इसका मतलब यह नहीं है कि पूरी अवधारणा बेकार है। मैं सी # में "कॉन्स्ट" एनोटेशन का कुछ वास्तव में सही और उपयोगी रूप देखना पसंद करूंगा , एक एनोटेशन जो मानव और संकलक दोनों को कोड को समझने में मदद करने के लिए उपयोग कर सकते हैं, और यह कि रनटाइम का उपयोग स्वचालित पार्सलाइज़ेशन जैसी चीजों को करने के लिए कर सकता है और अन्य उन्नत अनुकूलन।
उदाहरण के लिए, कल्पना करें कि क्या आप कोड के एक हंक के चारों ओर "एक बॉक्स खींच सकते हैं" और कहते हैं कि "मुझे गारंटी है कि कोड का यह हंक इस वर्ग के किसी भी क्षेत्र में कोई उत्परिवर्तन नहीं करता है" इस तरह से संकलक द्वारा जांच की जा सकती है। या एक बॉक्स खींचिए जो कहता है कि "यह शुद्ध विधि ऑब्जेक्ट की आंतरिक स्थिति को बदल देती है लेकिन किसी भी तरह से बॉक्स के बाहर देखने योग्य नहीं है"। इस तरह की वस्तु को सुरक्षित रूप से बहु-सूत्रित नहीं किया जा सकता है लेकिन इसे स्वचालित रूप से याद किया जा सकता है । सभी प्रकार के दिलचस्प एनोटेशन हैं जिन्हें हम कोड पर डाल सकते हैं जो समृद्ध अनुकूलन और गहरी समझ को सक्षम करेंगे। हम कमजोर सी-स्टाइल कॉन्स्ट एनोटेशन से बेहतर तरीके से कर सकते हैं।
हालांकि, मैं इस बात पर जोर देता हूं कि यह सिर्फ अटकलबाजी है । हमारे पास इस तरह की सुविधा को C # के किसी भी काल्पनिक भविष्य के संस्करण में डालने की कोई ठोस योजना नहीं है, अगर यहां तक कि एक भी है, जिसे हमने एक या दूसरे तरीके से घोषित नहीं किया है। यह कुछ ऐसा है जिसे मैं देखना पसंद करूंगा, और कुछ ऐसा जो मल्टी-कोर कंप्यूटिंग पर आने वाले जोर की आवश्यकता हो सकती है, लेकिन इसमें से किसी को भी किसी भी तरह की भविष्यवाणी या सी # के लिए किसी विशेष सुविधा या भविष्य की दिशा की गारंटी नहीं माना जाना चाहिए।
अब, यदि आप जो चाहते हैं, वह स्थानीय चर पर एक एनोटेशन है जो एक पैरामीटर है जो कहता है कि "इस पैरामीटर का मान पूरे विधि में नहीं बदलता है", तो, निश्चित रूप से, यह आसानी से किया जाएगा। हम "आसानी से" स्थानीय लोगों और मापदंडों का समर्थन कर सकते हैं जिन्हें एक बार शुरू किया जाएगा, और विधि में बदलाव के लिए एक संकलन-समय त्रुटि। "उपयोग" कथन द्वारा घोषित चर पहले से ही ऐसा स्थानीय है; हम सभी स्थानीय लोगों और मापदंडों के लिए एक वैकल्पिक एनोटेशन जोड़ सकते हैं ताकि उन्हें "चर" का उपयोग करके "जैसा कार्य" किया जा सके। यह कभी भी उच्च प्राथमिकता वाला फीचर नहीं रहा है इसलिए इसे कभी लागू नहीं किया गया।