2009-02-09 12 views
14

सी # में संदर्भ सी ++ पर समान हैं, सिवाय इसके कि वे कचरा एकत्रित हैं।सी #+ के समान सी # प्रस्ताव स्थिरता क्यों नहीं है?

  1. सदस्य कार्यों में चिह्नित const:

    क्यों के लिए सी # संकलक निम्नलिखित का समर्थन करने के लिए यह तो बहुत मुश्किल है।

  2. डेटा प्रकारों (स्ट्रिंग के अलावा) के संदर्भ const चिह्नित, जिसके माध्यम से केवल const सदस्य फ़ंक्शंस को कॉल किया जा सकता है?

मुझे विश्वास है कि यह वास्तव में उपयोगी होगा अगर सी # ने इसका समर्थन किया। एक के लिए, यह वास्तव में व्यापक रूप से व्यापक समलैंगिक त्याग में मदद करेगा जिसके साथ सी # प्रोग्रामर निजी डेटा के नग्न संदर्भ लौटाते हैं (कम से कम मैंने अपने कार्यस्थल पर जो देखा है)।

या क्या पहले से ही सी # में समतुल्य कुछ है जो मुझे याद आ रहा है? (मुझे readonly और const कीवर्ड के बारे में पता है, लेकिन वे वास्तव में उपर्युक्त उद्देश्य की सेवा नहीं करते हैं)

उत्तर

17

मुझे लगता है वहाँ कुछ व्यावहारिक कारणों, और कुछ सैद्धांतिक कारण हैं:

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

वहाँ क्यों यह समर्थित नहीं किया जा सकता है के मामले में एक बड़ी है अब हालांकि:

  • अनुकूलता पिछड़ों: कोई रास्ता नहीं सभी पुस्तकालयों सही ढंग से स्थानांतरित कर दिए करेंगे, जिससे यह काफी बेकार :(

मैं मानता हूँ यह constness सूचक के कुछ प्रकार के लिए उपयोगी होगा, लेकिन मैं इसे नहीं हो रहा देख सकते हैं, मुझे डर लग रहा।

संपादित करें: जावा समुदाय में उम्र के लिए इस क्रोध के बारे में एक तर्क रहा है। वहाँ बल्कि relevant bug जो आपको दिलचस्प लग सकती पर टिप्पणी की एक बहुत कुछ है।

+0

धन्यवाद जॉन। यह रोशनी है। –

0

सवाल यह है कि क्या हमें सी # में स्थिरता की आवश्यकता है?

  1. मैं यकीन है कि घबराना कोई जानता है कि कि यह देखते हुए विधि वस्तु ही प्रभावित करने के लिए नहीं जा रहा है और पूर्ण रूप से अपने अनुकूलन इसी निष्पादित करता हूँ। (शायद द्वारा callcallvirt के बजाय उत्सर्जक?)

  2. मुझे यकीन है कि हम उन की जरूरत है, के बाद से constness के पेशेवरों के सबसे संबंधित प्रदर्शन कर रहे हैं, आप बिंदु 1.

पर खत्म नहीं कर रहा हूँ इसके अलावा, सी # में readonly कीवर्ड है।

+1

मैं आपके दावे से असहमत हूं कि "दृढ़ता के अधिकांश पेशेवर प्रदर्शन से संबंधित हैं" - मैं कहूंगा कि अधिकांश शुद्धता और रखरखाव से संबंधित हैं। –

+2

यह जेआईटर की सुविधा के लिए नहीं है, लेकिन प्रोग्रामर के लिए। सी ++ में, अगर मैं एक कॉन्स ऑब्जेक्ट को बदलने की कोशिश कर रहा हूं, तो संकलक मुझे एक त्रुटि देता है। तो, उदाहरण के लिए, मैं अपने तरीकों से कॉन्स संदर्भ वापस कर सकता हूं। सी # में सभी लोग संदर्भ लौट रहे हैं कि बाहर कोई भी बदल सकता है। खतरनाक! –

+0

@ फ़्रेडरिक: बिल्कुल :) –

6

जैसा कि जॉन पहले से ही कवर किया गया है (बेशक) कॉन्स शुद्धता उतनी आसान नहीं है जितनी दिखाई दे सकती है। सी ++ यह एक तरीका है। डी यह एक और (तर्कसंगत रूप से अधिक सही/उपयोगी) तरीका करता है। सी # इसके साथ फ्लर्ट करता है लेकिन कुछ और साहसी नहीं करता है, जैसा कि आपने पाया है (और शायद कभी भी अच्छा नहीं है, क्योंकि जॉन अच्छी तरह से फिर से ढंका हुआ है)।

उसने कहा, मुझे विश्वास है कि जॉन के "सैद्धांतिक कारणों" में से कई को डी मॉडल में हल किया गया है।

डी में (2.0), स्थिरांक बहुत सी ++ तरह काम करता है, सिवाय इसके कि यह पूरी तरह से संक्रामक है (ताकि स्थिरांक एक सूचक के लिए लागू वस्तु के लिए, उस वस्तु के किसी भी सदस्य ने बताया करने के लिए लागू होता है, किसी भी संकेत दिए गए कि वस्तु थी, वस्तुओं उन्होंने इत्यादि की ओर इशारा किया) - लेकिन यह स्पष्ट है कि यह केवल उस चर से लागू होता है जिसे आपने कॉन्स घोषित किया है (इसलिए यदि आपके पास पहले से ही एक गैर-कॉन्स्ट ऑब्जेक्ट है और आप इसे एक कॉन्स्ट पॉइंटर लेते हैं, तो गैर-कॉन्स्ट चर अभी भी राज्य को बदलो)।

डी एक और कीवर्ड - invariant प्रस्तुत करता है - जो ऑब्जेक्ट पर ही लागू होता है। इसका मतलब यह है कि शुरू होने के बाद कभी भी राज्य को कुछ भी नहीं बदल सकता है।

इस व्यवस्था की सुंदरता यह है कि एक कॉन्स विधि दोनों कॉन्स्ट और इनवेंटरी ऑब्जेक्ट्स को स्वीकार कर सकती है। चूंकि अपरिवर्तनीय वस्तुओं रोटी और कार्यात्मक दुनिया के मक्खन, और स्थिरांक तरीका है के रूप में "शुद्ध" कार्यात्मक अर्थ में चिह्नित किया जा सकता - हालांकि यह अस्थायी वस्तुओं के साथ इस्तेमाल किया जा सकता है।

ट्रैक पर वापस हो रही है - मुझे लगता है कि यह मामला है कि हम केवल अब (naughties के उत्तरार्ध) कैसे स्थिरांक (और अपरिवर्तनीय) का उपयोग करने के लिए सबसे अच्छा समझने रहे है। नेट मूल रूप से परिभाषित किया गया था जब चीजें अधिक खतरनाक थीं, इसलिए बहुत अधिक प्रतिबद्ध नहीं था - और अब इसे पुनः निकालने में बहुत देर हो चुकी है।

मैं नेट वी एम पर डी रन की एक बंदरगाह को देखने के लिए अच्छा लगेगा, हालांकि :-)

5

Mr. Heljsberg, सी # भाषा के डिजाइनर पहले से ही इस सवाल का जवाब है:

http://www.artima.com/intv/choicesP.html

+0

दिलचस्प, मैंने इसे नहीं देखा था। मुझे लगता है कि कार्यात्मक परिप्रेक्ष्य (जैसा कि मेरे उत्तर में लाया गया है) के साथ यह किसी भी कठिनाई को बनाता है, हालांकि। – philsquared

2

मुझे आश्चर्य नहीं होगा अगर सी # के भविष्य के संस्करण में अपरिवर्तनीय प्रकार जोड़े गए थे। सी # 3.0 के साथ उस दिशा में पहले ही चल रहा है।

बेनामी प्रकार, उदाहरण के लिए, अपरिवर्तनीय है।

मुझे लगता है, समानांतरवाद गले लगाने के लिए तैयार किया गया है एक्सटेंशन का एक परिणाम के रूप में, आप अचल स्थिति अधिक से अधिक पॉप अप देखे जाने की संभावना हो जाएगा।

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