2010-06-03 7 views
8

संभव डुप्लिकेट:
“const correctness” in C#चर और विधियों के लिए 'const' के साथ डिज़ाइन नहीं किया गया था?

मुझे लगता है const सामान्य भाषा सादगी के लिए सी # कल्पना के लिए सरल बनाया गया था। क्या कोई विशिष्ट कारण है कि हम परिवर्तनीय संदर्भ या विधियों को const के रूप में घोषित नहीं कर सकते जैसे हम सी ++ के साथ कर सकते हैं? उदाहरण:

const MyObject o = new MyObject(); // Want const cast referenece of MyObject 
o.SomeMethod(); // Theoretically legal because SomeMethod is const 
o.ChangeStuff(); // Theoretically illegal because ChangeStuff is not const 

class MyObject 
{ 
    public int val = 0; 

    public void SomeMethod() const 
    { 
     // Do stuff, but can't mutate due to const declaration. 
    } 

    public void ChangeStuff() 
    { 
     // Code mutates this instance. Can't call with const reference. 
     val++; 
    } 
} 
+1

आपका मतलब है, "सी ++ - शैली 'const'ness के पास दूर-दराज के प्रभाव हैं जो सही करने के लिए वास्तव में कठिन हैं (एक डिजाइन और कार्यान्वयन पीओवी दोनों से) और जिसके लिए कोई रनटाइम समर्थन नहीं है"? यह एक उपयोगी, लेकिन वास्तव में महंगा सुविधा है। एफडब्ल्यूआईडब्ल्यू, एफ # विपरीत दृष्टिकोण लेता है: * कुछ भी नहीं * जब तक घोषित नहीं किया जाता है। हालांकि, ढांचे के साथ बातचीत गैर-स्पष्ट हो सकती है। –

+0

मैं असहमत हूं कि यह एक सटीक डुप्लिकेट है। पुराना सवाल यह पूछता है कि कोड में इसे कैसे कार्यान्वित किया जाए। @ स्पॉल्सन पूछता है कि यह कंपाइलर में क्यों नहीं है। –

+1

कॉन्स शुद्धता को सार्थक होने के लिए लागू करने की आवश्यकता है। यह तब मुश्किल हो जाता है जब कोई .NET सक्षम भाषा किसी अन्य भाषा द्वारा बनाए गए प्रकारों का उपभोग कर सकती है। उनमें से सौ के करीब शायद हैं। इन सभी भाषाओं के वाक्यविन्यास को घोषित करने के लिए संशोधित कॉन्स विशेषताओं और उनके कंपाइलर्स को समायोजित करने के लिए संशोधित किया जाना चाहिए। दूसरे शब्दों में, दृढ़ता सहीता गैर-सीएलएस अनुपालन है। –

उत्तर

0

मुझे संदेह है कि आपके प्रश्न की पहली वाक्य इसका उत्तर देती है।

0

मेरा मानना ​​है कि आप सी # में const के रूप में चर घोषित कर सकते हैं। static साथ ही, यदि आपको आवश्यकता महसूस होती है।

http://msdn.microsoft.com/en-us/library/e6w8fe1b(VS.71).aspx

+1

सी # में केवल आदिम प्रकार (और 'स्ट्रिंग') को 'const' घोषित किया जा सकता है। – zneak

+0

ठीक है। मेरी गलती। –

1

एक स्थिरांक जहाँ भी यह प्रयोग किया जाता है और इसलिए किसी भी क्रम अर्थ नहीं है मूल्य का एक संकलन समय प्रतिस्थापन करता है। सामान्य रूप से आप जो कॉन्स ऑब्जेक्ट्स के लिए प्रस्तावित करते हैं, वह संकलक को निर्धारित करने के लिए बहुत मुश्किल होगा (यदि कोई विधि ऑब्जेक्ट को संशोधित करेगी या नहीं)। एक एक्सेस संशोधक के रूप में एक कॉन्स कीवर्ड का उपयोग करने का आपका प्रस्ताव तब भी लेखक पर बोझ डालता है और आप अभी भी कुछ की पुष्टि करने की समस्या के साथ छोड़ दिया है या ऑब्जेक्ट को संशोधित नहीं करता है। इसके अलावा आप उस वस्तु पर कुछ लगा रहे हैं जिसका सभी संदर्भों में कोई अर्थ नहीं है। विधि का मतलब क्या है इसका मतलब क्या है लेकिन आप इसे एक कॉस्ट ऑब्जेक्ट के रूप में उपयोग नहीं कर रहे हैं? जो कार्यक्षमता आप चाहते हैं वह आम तौर पर एक इंटरफेस को लागू करके और कक्षा के "केवल पढ़ने के लिए" भागों को उजागर करके पूरा किया जाता है।

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

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