2009-05-09 11 views
21

सी # एक ही पंक्ति पर स्थिरांक और स्थैतिक क्यों नहीं है? जावा में, आपको निरंतर कार्य करने के लिए 'स्थिर' और 'अंतिम' के रूप में एक फ़ील्ड घोषित करना होगा। सी # आपको कॉन्स को फाइनल घोषित क्यों नहीं करता है?सी # एक ही पंक्ति पर स्थिरांक और स्थिर की अनुमति क्यों नहीं देता है?

मैं आगे भेद करता हूं कि जावा में, प्रत्येक इंटरफ़ेस सार्वजनिक और सार है, चाहे यह स्पष्ट रूप से घोषित किया गया हो या नहीं। प्रकृति में प्रभावी रूप से स्थैतिक नहीं हैं? इस पर सी # बाक क्यों है?

+0

मैंने सोचा था कि तुमने कहा तुम वापस Jave को लगा दिया था। तो क्यों ख्याल रखेगा! ;) –

+0

बी/सी अब मैं उत्सुक हूं =) मैं वास्तव में समझ में नहीं आता कि यह एक संकलित त्रुटि क्यों है यदि यह स्पष्ट रूप से स्पष्ट रूप से यह बताता है कि जो मूल रूप से सत्य है। – Cuga

+0

एमएम शायद इसलिए कि जावा सीधे स्थिरांक का समर्थन नहीं करता है इसलिए यही कारण है कि आपको निरंतर प्राप्त करने के लिए स्थैतिक आधार का उपयोग करना होगा .. जबकि सी # में स्थिरता प्रकृति द्वारा स्थिर है जैसे ग्रेग का उल्लेख किया गया है और संकलन समय पर सेट किया गया है। कुछ लोग सी # में स्थैतिक रूप से भ्रमित भ्रमित करते हैं, जो रनटाइम पर मान सेट कर सकते हैं। – jasonco

उत्तर

37

स्थिरांक और स्थिर वास्तव में अलग अलग बातें, विभिन्न भंडारण तंत्र, विभिन्न initialisation मतलब है। स्थिर पढ़ा/लिखना है, इसलिए भंडारण के लिए आवंटित स्मृति होनी चाहिए और इसे रनटाइम पर प्रारंभ किया जाना चाहिए। स्थिर को शाब्दिक मूल्य या अभिव्यक्ति के साथ प्रारंभ किया जा सकता है। इसके विपरीत, const अपरिवर्तनीय है और संकलन समय निरंतर (आमतौर पर एक शाब्दिक मान, या अभिव्यक्ति जिसे संकलन समय पर पूरी तरह से मूल्यांकन किया जा सकता है) के साथ प्रारंभ किया जाना चाहिए। मान संकलन समय पर जाना जाता है ताकि इसे सीधे जेनरेट कोड में एम्बेड किया जा सके, इसलिए रनटाइम पर आवंटित करने के लिए कोई संग्रहण आवश्यक नहीं है।

+0

सच, स्थिर और स्थिर मतलब विभिन्न चीजें हैं। लेकिन 'कॉन्स्ट' और 'स्थिर अंतिम' ... क्या अंतर है? – Cuga

+0

प्रश्न सी # से संबंधित है - सी # में कोई 'अंतिम' कीवर्ड नहीं है। –

+0

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

22

उनकी प्रकृति द्वारा स्थिरांक स्थिर हैं, इसलिए यह अनावश्यक होगा।

+0

ठीक है, लेकिन जैसा कि मैंने कहा था ... जावा आपको इंटरफ़ेस को 'सार्वजनिक' और 'सार' के रूप में घोषित करने देता है। यह निहित है, इसलिए यह कोई त्रुटि नहीं है। तो यदि आप स्पष्ट रूप से निहित हैं तो यह सी # में एक त्रुटि क्यों है? – Cuga

+9

अनावश्यक पसंद को कम करना आम तौर पर आईएमओ में अच्छा विचार है। – Sake

+1

मैं आपको वह दूंगा। मैं आपकी टिप्पणी को अब तक का सबसे अच्छा जवाब मानता हूं। – Cuga

1

क्योंकि अंतर्निहित संशोधक संशोधक की आवश्यकता नहीं है और भ्रम पैदा कर सकता है। यदि आप

static const int A = 3 
const int B = 5 

पर विश्वास कर सकते हैं कि वे 2 अलग-अलग प्रकार के स्थिरांक हैं।
यहां तक ​​कि वीबी 2008 (जो आपकी इच्छा के अनुसार बहुत वर्बोज़ हो सकता है) इसकी अनुमति नहीं देता है।

+0

यही कारण नहीं है (हालांकि आप भ्रमित होने के बारे में सही हो सकते हैं)। उदाहरण के लिए, यदि मैं एक फ़ील्ड घोषित करता हूं और इसे कोई एक्सेस मॉडिफायर नहीं देता, तो क्या यह सार्वजनिक, निजी, स्थैतिक, आंतरिक, क्या है? डिफ़ॉल्ट निजी है, लेकिन आपको इसे स्पष्ट रूप से घोषित करने की आवश्यकता नहीं है। कारण स्थिर और स्थिरता का एक साथ उपयोग नहीं किया जा सकता है क्योंकि वे विभिन्न भंडारण तंत्र का संकेत देते हैं और इसलिए परस्पर अनन्य हैं। –

3

यह एक C# const implies static लेकिन, सी # कीवर्ड readonly में जावा के अंतिम कीवर्ड को एक बराबर है कि सच है।

तो, वास्तव में, सी # एक स्थिरांक अंतिम की अनुमति देता है, यह सी # में स्थिर केवल पढ़ने के लिए है।

+1

"स्थैतिक रीडोनली" "कॉन्स्ट" जैसा नहीं है। एक निरंतर संकलित किया जाएगा। स्थैतिक रीडोनली को मूल स्थान से संदर्भित किया जाएगा। यदि मूल्य भविष्य में या यहां तक ​​कि इंस्टेनेशन में भी सकारात्मक परिवर्तन हो सकता है तो आपको केवल पढ़ने के लिए उपयोग करना चाहिए। यदि यह वास्तव में स्थिर रहेगा और कभी भी नहीं बदलेगा (जैसे प्राकृतिक लॉग, पीआई, आदि) तो कॉन्स एक अच्छी पसंद है। अन्यथा आप "सार्वजनिक स्थैतिक पढ़ने" के साथ बेहतर हो सकते हैं –

+0

मुझे खेद है, मैं जावा में "स्थैतिक अंतिम" का जिक्र कर रहा था, सी # (मोटे तौर पर) में "स्थिर पाठक" के बराबर है। – LWoodyiii

9

के रूप में कहा से पहले, स्थिर अंतिम जावा में सी # में स्थिर केवल पढ़ने के लिए के समान है। वास्तव में, आप कह रहे हैं कि यह सदस्य स्थैतिक है और इसकी सामग्री को बदला नहीं जा सकता है। इसके अलावा आप दोनों मामलों में स्थिर कन्स्ट्रक्टर से मूल्य निर्दिष्ट कर सकते हैं।

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

जावा के पास const के बराबर नहीं है। आप कहीं भी पढ़ सकते हैं कि स्थैतिक अंतिमडेफिन के समतुल्य है लेकिन यह इतना अस्पष्ट है।पूरी तरह से अलग तंत्र, सामान्य में कुछ भी नहीं, लेकिन अंत में परिणाम कोड समान है - कोड की बेहतर रखरखाव और पठनीयता।

आपको स्थिर सदस्यों के रूप में सी # में स्थिरांक के बारे में सोचना बंद करना होगा क्योंकि वे नहीं हैं। डेफिन के ओओपी संस्करण के रूप में उनके बारे में सोचें। जब आप अंतिम और केवल फ़ील्ड को केवल अपने मूल्य को बदलने से अपने कोड को रोकने के लिए encapsulation पर विचार करते हैं। और यह मेरे लिए स्थिर की तरह नहीं लगता है।

Sumary:

  • अंतिम = केवल पढ़ने के लिए
  • स्थिर अंतिम = स्थिर केवल पढ़ने के लिए
  • एन/ए = स्थिरांक
संबंधित मुद्दे