2013-06-14 8 views
17

const और immutable डी में क्वालीफायर टाइप करने के बीच क्या अंतर है?डी में कॉन्स और अपरिवर्तनीय के बीच क्या अंतर है?

+3

आप इस लिंक पर अपरिवर्तनीयता के बारे में पढ़ सकते हैं http://ddili.org/ders/d.en/const_and_immutable.html – yaz

उत्तर

15

कुछ है कि const कि संदर्भ के माध्यम से उत्परिवर्तित नहीं किया जा सकता लेकिन द्वारा उत्परिवर्तित किया जा सकता है एक ही डेटा के एक परिवर्तनीय संदर्भ। immutable पर कुछ ऐसा किसी भी उस डेटा के संदर्भ में उत्परिवर्तित नहीं किया जा सकता है। तो, अगर आप

const C c = foo(); 

तो आप जानते हैं कि आप वस्तु c के माध्यम से c से जाना जाता उत्परिवर्तित नहीं सकते हैं, लेकिन वस्तु को अन्य संदर्भ c से जाना जाता अपने कोड में मौजूद हो सकता है, और अगर वे परिवर्तनशील हैं , वे इसे बदल सकते हैं और इसलिए c देख सकते हैं। लेकिन अगर आप

immutable C c = foo(); 

तो आप जानते हैं कि यह वस्तु को बदलने के लिए c से संबोधित किया जाता के लिए संभव नहीं है। एक बार immutable ऑब्जेक्ट का निर्माण हो जाने के बाद, इसे रद्द करने के लिए अवैध है, और जब तक आप कास्टिंग के माध्यम से टाइप सिस्टम को विचलित नहीं करते हैं, तो immutable ऑब्जेक्ट के लिए एक म्यूटेबल संदर्भ होना संभव नहीं है। और immutable ऑब्जेक्ट्स को केवल पढ़ने योग्य स्मृति में रखा जा सकता है यदि संकलक चुनता है, तो आप वास्तव में segfaults प्राप्त कर सकते हैं और जैसे कि आपने कभी immutable को निकालने और ऑब्जेक्ट को म्यूट करने का प्रयास किया है। const के लिए यह वही है, क्योंकि const संदर्भ वास्तव में immutable ऑब्जेक्ट को संदर्भित कर सकता है। या तो const या immutable को कास्ट करना और उसके बाद उस म्यूटेबल ऑब्जेक्ट को म्यूट करना अपरिभाषित व्यवहार है और मूल रूप से कभी नहीं किया जाना चाहिए।

और immutable ऑब्जेक्ट को किसी अन्य संदर्भ द्वारा कभी भी उत्परिवर्तित नहीं किया जा सकता है, immutable ऑब्जेक्ट को एकाधिक धागे से पढ़ना पूरी तरह से थ्रेड-सुरक्षित है। इसलिए, immutable ऑब्जेक्ट्स को थ्रेड में पूरी तरह से साझा किया जाता है, जबकि अन्य सभी जिन्हें shared के साथ स्पष्ट रूप से चिह्नित नहीं किया जाता है, को थ्रेड-लोकल माना जाता है। immutableconst की तुलना में कंपाइलर को बेहतर अनुकूलन अवसर भी प्रदान करता है, क्योंकि यह कभी भी बदलने की गारंटी नहीं देता है, जबकि const ऑब्जेक्ट उसी डेटा के किसी अन्य संदर्भ के माध्यम से बदल सकता है।

मूल्य प्रकारों के लिए, const और immutable (क्योंकि आपके पास गैर-परिवर्तनीय मान प्रकारों के लिए परिवर्तनीय संदर्भ नहीं हो सकते हैं) के बीच वास्तव में बहुत अंतर नहीं है, लेकिन संदर्भ प्रकारों के लिए, एक महत्वपूर्ण अंतर है।

+1

एक बहुत ही निर्देशक उत्तर के लिए धन्यवाद। डी डेवलपर्स आमतौर पर मूल्य प्रकारों के लिए कौन सा उपयोग करते हैं? – user763305

+1

@ user763305 इस समय, मैं किसी एक तकनीकी कारण के बारे में सोच नहीं सकता कि एक दूसरे को पसंद किया जाए, और मुझे नहीं पता कि औसत डी डेवलपर क्या उपयोग करना चुनता है। व्यक्तिगत रूप से, मैं 'अपरिवर्तनीय' चुनता हूं, क्योंकि तब यह स्पष्ट होता है कि इसे बिना किसी मूल्य के यह उत्परिवर्तित किया जा सकता है कि यह एक मूल्य प्रकार है, लेकिन यह केवल व्यक्तिगत वरीयता है। –

+0

लेकिन निश्चित रूप से 'स्ट्रिंग' के चरित्र से 'अपरिवर्तनीय' को कास्ट करना ठीक है? –

1

वे पाते हैं कि immutable डेटा में अलग हैं, वास्तव में केवल पढ़ने के लिए वर्गों स्मृति के में रखा जा सकता था, और इसलिए, किसी भी प्रयास को डेटा यह असफल हो जायेगी संशोधित करने के लिए।

कुछ घोषित const (और नहीं अपरिवर्तनीय) दूसरी तरफ आर/डब्ल्यू अनुभाग और मूल्य में मौजूद है अभी भी यह करने के लिए एक अलग गैर स्थिरांक संदर्भ के माध्यम से बदला जा सकता है।

तो, इस तरह के मामले में "कॉन्स्ट-नेस" को छोड़ दिया जा सकता है, जबकि अपरिवर्तनीयता नहीं हो सकती है।

(Reference)

+0

यह बिल्कुल सही नहीं है क्योंकि 'कॉन्स्ट' डेटा वास्तव में' अपरिवर्तनीय 'हो सकता है। तो 'const' डेटा केवल पढ़ने योग्य खंडों में भी हो सकता है क्योंकि 'अपरिवर्तनीय' डेटा 'const'' पर स्पष्ट रूप से रहता है। – yaz

+0

@yaz सहमत। मैं इस मामले में अस्थिर होने के बारे में बात नहीं कर रहा था। –

13

जब आप const के रूप में कुछ की घोषणा, तुमसे वादा करता हूँ कि आप इसे संशोधित नहीं करेगा। कुछ immutable के रूप में घोषित किया जाता है, आप का वादा किया हो कि इसे कहीं और संशोधित नहीं किया जाएगा (और बेशक, आप इसे या तो संशोधित नहीं कर सकते)

0

const प्रकार की एक चर घोषित एक परिवर्तनीय मूल्य या अपरिवर्तनीय मान स्वीकार कर सकते हैं। यह परिभाषा संदर्भित प्रकारों जैसे सरणी और वस्तुओं या पॉइंटर्स के लिए प्रासंगिक है। यह आमतौर पर फ़ंक्शन तर्कों के लिए उपयोग किया जाएगा। तो डी कॉन्स्ट में म्यूटेबल और अपरिवर्तनीय मूल्यों के लिए वाइल्डकार्ड विशेषता का एक प्रकार है।

यह उन मूल्यों के लिए अधिक समझ नहीं है जो एक char, int या float जैसे असाइनमेंट के साथ प्रतिलिपि बनाई गई हैं।

सी और सी ++ में पाए गए एक से कॉन्स्ट और अपरिवर्तनीय अवधारणा बहुत अलग है। मैं इससे बहुत उलझन में था।

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