2010-03-28 2 views
12

में स्थिरता का बिंदु क्या है कोई भी बता सकता है कि सी # में निरंतर बिंदु क्या है?सी #

उदाहरण के लिए,

const int months = 12; 

कर के रूप में

int months = 12; 

मैं कि स्थिरांक बदला नहीं जा सकता करने के लिए विरोध का लाभ क्या है, लेकिन फिर क्यों नहीं बस ... परिवर्तन नहीं इसे शुरू करने के बाद यह मूल्य है?

+12

निजी तरीके क्यों हैं जब आप केवल सब कुछ सार्वजनिक कर सकते हैं और केवल आवश्यक लोगों को कॉल कर सकते हैं? – zxcvbnm

+0

जितना अधिक आप अपने कोड में अपने * इरादे * को संवाद कर सकते हैं, उतना ही अधिक संकलक आपके लिए क्रॉस-चेक कर सकता है, दूसरों के पढ़ने और समझने के लिए जितना आसान होगा। कुछ अतिरिक्त संभावित अनुकूलन भी हैं जो संकलक द्वारा किए जा सकते हैं। –

उत्तर

3

ध्यान रखें कि आप मूल्य का उपयोग करने वाले एकमात्र व्यक्ति नहीं हो सकते हैं। न केवल आप इसे बदल सकते हैं, लेकिन कोई भी आपके कोड का उपयोग नहीं कर रहा है (उदाहरण के लिए लाइब्रेरी के रूप में) इसे बदल सकता है।

और इसे स्थिर के रूप में चिह्नित करने से आपका इरादा स्पष्ट हो जाता है।

2

यही है। आप संकलक को बताते हैं कि यह कभी भी नहीं बदल सकता है, और संकलक यह जानकर बेहतर ढंग से अनुकूलित कर सकता है कि यह अपरिवर्तनीय है।

14

के बीच "नहीं बदल सकते हैं" और "परिवर्तन नहीं होगा" अंतर केवल वास्तव में स्पष्ट हो जाता है जब निम्न स्थितियों में से एक प्राप्त:

  • अन्य डेवलपर्स अपने कोड पर काम शुरू,
  • तीसरे -parties का उपयोग कर अपना कोड, या
  • एक वर्ष गुजरता है और आप उस कोड पर वापस आते हैं।

डेटा पहुंच के बारे में बात करते समय बहुत ही समान प्रश्न उठते हैं। विचार यह है कि आप चाहते हैं कि आपका कोड केवल उतना ही लचीलापन प्रदान करे, जैसा कि आप चाहते हैं, क्योंकि अन्यथा कोई (संभवतः आप) साथ आएगा और ऐसा कुछ करेगा जो आप नहीं चाहते थे, जिससे बग की ओर जाता है!

+1

मैं आपकी टिप्पणियों से सहमत हूं लेकिन आप "कॉन्स्ट" के अस्तित्व के लिए शायद सबसे महत्वपूर्ण कारण शामिल करना भूल गए हैं: यह संकलक को प्रोग्राम को अनुकूलित करने की अनुमति देता है। – user88637

+3

दरअसल, मैं प्रस्तुत करता हूं कि प्रदर्शन 'const' का उपयोग करने के लिए * सबसे खराब * कारण है। (जो यह नहीं कहना है कि मामलों के एक छोटे प्रतिशत में सूक्ष्म अनुकूलन के लिए रखरखाव बलिदान के लायक नहीं है।) – ladenedge

1

कई कारणों के लिए:

  1. आप निश्चित मूल्यों है कि अन्य चर से कुछ अर्थ नहीं है अंतर करने के लिए चाहते हैं।
  2. आप बाद में भूल सकते हैं कि आप मूल्य बदलने के लिए नहीं हैं, और अप्रत्याशित व्यवहार का कारण बनते हैं।
  3. आपका कोड अन्य लोगों द्वारा उपयोग किया जा सकता है, वे इसे बदल सकते हैं (विशेष रूप से यदि आप लाइब्रेरी या एपीआई विकसित कर रहे हैं)।
  4. क्योंकि हर चीज जो गलत हो सकती है आमतौर पर - इसलिए रनटाइम के बजाए संकलन समय पर ऐसी त्रुटियों को खोजने योग्य बनाते हैं।
-1

नियम यह है कि कई प्रोग्रामर का पालन है में से एक: कभी हार्ड कोड किसी भी चर/0. को छोड़कर इसका मतलब है कि, बजाय

for(int i=0; i<100; i++) {} 

करने का क्या करना चाहिए

const loopCount = 100; 
.... 
for (int i=0; i<loopCount; i++) {} 

मैं कॉन्स का उपयोग करना सोचें इसे बदलने का एक अच्छा कारण है। और वास्तव में, इसके लिए और भी अधिक कारण है:

  1. कंपाइलर - मेमोरी, प्रदर्शन के लिए अनुकूलित करें।
  2. प्रोग्रामर को बताएं जो आपके काम का पालन करता है, यह CONSTANT
  3. यदि आपको रिफैक्टर करने की आवश्यकता है, तो अपना मन नंबर में बदलें, आपको पता है कि कहां जाना है। और सुनिश्चित करें कि कोड में कोई अन्य स्थान इसे बदल नहीं देगा।
+3

यह नहीं होना चाहिए (int i = 0; i Gabe

+6

स्पष्ट होने के लिए, xandy, आपने अभी भी चर के मूल्य को हार्ड-कोड किया है। आपने अभी ऐसा स्थान किया है जो मूल्य से प्रासंगिक है, जहां से संभवतः काफी परेशान हो सकता है। एक नियम के बाद अंधेरे से "स्थिरांक को छोड़कर हार्ड-कोड न करें" कभी-कभी इसका पालन करने से भी बदतर हो सकता है। – ladenedge

2

का उपयोग करना स्थिरांक प्रोग्रामर यह भी संकलन समय पर मूल्यों डालने और एक रजिस्टर/स्मृति स्थान से अनुमान लगाया नहीं किया जा रहा द्वारा चर की तुलना में गणना को गति की तरह

const double PI = 3.14159; 

वास्तविक मूल्य से अधिक पठनीयता का लाभ दिया है।

+9

पीआई एक int है? :-) – Ken

+0

@ कंचिर्क: वहां, मैंने इसे आपके लिए सही किया। – missingfaktor

+0

@ राहुल जी/@ केन धन्यवाद #lol – kanchirk

0

"बिंदु" इतना है कि आप एक प्रोग्राम-व्यापी चर का उपयोग कर सकते हैं और इसे बदलने के लिए केवल एक स्थान है।

कल्पना करें कि क्या आप एक वीडियो गेम बना रहे हैं जो 100 अलग-अलग कोड फ़ाइलों में एफपीएस (फ्रेम प्रति सेकेंड) जानने पर निर्भर था। तो दिखाएं कि एफपीएस 50 था ... और आपके पास उन सभी फ़ाइलों और कार्यों में "50" संख्या थी ... तो आप महसूस करते हैं कि आप इसे 60 एफपीएस बनाना चाहते हैं ... उन 100 फ़ाइलों को बदलने के बजाय, आप बस इसे बदलें:

const int FRAMES_PER_SECOND = 60; 

और उन फ़ाइलों/कार्यों में, आप FRAMES_PER_SECOND चर का उपयोग करेंगे।

वैसे, इसका सी # के साथ कुछ लेना देना नहीं है ... स्थिरांक कई भाषाओं में हैं।

+0

आप वैश्विक चर के बारे में बात कर रहे हैं, न कि 'const' चर। मैं 'const' कीवर्ड का उपयोग किए बिना बिल्कुल सुझाव दे सकता हूं। –

+1

हां, इसे चिह्नित करने के अलावा, कंपाइलर और डेवलपर दोनों को सूचित करता है कि मान एक बार परिभाषित किया गया है, और ऐसा कुछ नहीं है जिसे समय के साथ बदला जा सके। "सीधे संकलित कोड में" के लिए – kyoryu

30

यदि संकलक जानता है कि एक मान स्थिर है और कभी नहीं बदलेगा, तो यह आपके प्रोग्राम में सीधे मूल्य को संकलित कर सकता है।

यदि आप स्थिर होने के लिए pi घोषित करते हैं, तो हर बार जब यह pi/2 देखता है तो संकलक गणना कर सकता है और संकलित कोड में सीधे 1.57 डाल सकता है। यदि आप एक चर के रूप में pi घोषित करते हैं, तो हर बार जब आपका प्रोग्राम pi/2 का उपयोग करता है तो कंप्यूटर को पीआई चर का संदर्भ देना होगा और इसे 0.5 से गुणा करना होगा, जो स्पष्ट रूप से धीमा है।

मुझे यह भी जोड़ना चाहिए कि सी # में readonly है जो संकलक की गणना नहीं कर सकता है, लेकिन जो आपके प्रोग्राम के निष्पादन की अवधि के लिए नहीं बदला जा सकता है। उदाहरण के लिए, यदि आप निरंतर ProgramStartTime चाहते थे, तो आपको इसे readonly DateTime ProgramStartTime = DateTime.Now घोषित करना होगा क्योंकि प्रोग्राम शुरू होने पर इसका मूल्यांकन किया जाना चाहिए। यह एक ही मूल्य हर बार जब आप इसे पढ़ है की जरूरत नहीं है

int Months { get { return 12; } } एक संपत्ति लेकिन किया जा रहा है:

अंत में, आप इसे एक गेटर लेकिन कोई सेटर, इस तरह देकर केवल पढ़ने के लिए संपत्ति बना सकते हैं , इस तरह:

int DaysInFebruary { get { return IsLeapYear ? 29 : 28 } }

+1

+1। –

+1

दिलचस्प बात यह है कि आप प्रतिबिंब का उपयोग करके 'readonly' फ़ील्ड को संशोधित कर सकते हैं :) – Juliet

+2

पसंद कॉन्स/रीडोनली में वर्जनिंग प्रभाव हैं। –

0

यह अपने इरादे के बारे में स्पष्ट होने का एक मामला है।

यदि आप मूल्य बदलने का इरादा रखते हैं, तो 'कॉन्स्ट' का उपयोग न करें। यदि आप मूल्य बदलने का इरादा नहीं रखते हैं, तो 'const' का उपयोग करें।

इस तरह दोनों कंपाइलर और तृतीय पक्ष (या यदि आप लंबे समय के बाद अपना कोड पढ़ते हैं) तो आप जान सकते हैं कि आप क्या चाहते हैं। यदि आप या कोई व्यक्ति मूल्य बदलने की गलती करता है, तो कंपाइलर इसका पता लगा सकता है।

और वैसे भी, 'कॉन्स्ट' का उपयोग करने के लिए अनिवार्य नहीं है।यदि आप सोचते हैं, तो आप स्वयं को 'कॉन्स्टेंसी' (बिना गलती का पता लगाने के लिए कंपाइलर चाहते हैं) को संभाल सकते हैं, फिर 'const' ;-) का उपयोग न करें।

1

एक मूल्य 'स्थिरांक' की घोषणा आप व्यक्तिगत अनुशासन लागू करने, कि मूल्य में कोई परिवर्तन की अनुमति नहीं दे द्वारा मदद करने के लिए खेलने में संकलक लाता है।

इसके अलावा, यह एक विधि को पार करने के दुष्प्रभावों के कारण अप्रत्याशित त्रुटियों को पकड़ लेगा (जिसे आप लगातार के रूप में व्यवहार करना चाहते हैं) एक 'रेफरी' पैरामीटर लेता है और अनुमानित रूप से मूल्य को अप्रत्याशित रूप से बदल सकता है।

7

आप गलतियों कभी नहीं करते हैं, तो किसी भी टीम के आप कभी भी गलतियाँ करता है के साथ काम पर कोई भी नहीं है, तो आप कभी नहीं एक चर का सही उद्देश्य भूल जाते हैं आप वापस आ रहा कोड करने के लिए आप महीनों या वर्षों में देखा नहीं किया है के बाद भी परिभाषित किया है , और आप और हर कोई जो आप 100% के साथ काम करते हैं, वह विश्वसनीय रूप से एक कॉन्स वैल्यू को बदलने के आपके इरादे को समझता है, समझता है और उसका पालन करता है जब आपने अंतर्निहित भाषा निर्माण का उपयोग करने के लिए परेशान नहीं किया है, जो दोनों स्पष्ट रूप से संकेत देते हैं और मजबूती को लागू करते हैं, तो नहीं, वहां कोई फायदा नहीं।

उन चीजों में से किसी एक कभी निकलती है तो मामला होने के लिए नहीं, उस बिंदु है।

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

कुछ मामलों में, कुछ कंपाइलर ऑप्टिमाइज़ेशन हो सकते हैं जो स्थिरता के आधार पर किया जा सकता है (एक के लिए निरंतर फोल्डिंग, जो संकलन समय पर स्थिरांक से युक्त अभिव्यक्ति को ध्वस्त करता है)। लेकिन आमतौर पर, यह बात नहीं है।

+1

यह एक मजेदार टीम की तरह लगता है। इसके अलावा, आपको दृश्य स्टूडियो की आवश्यकता नहीं है - डीबगर के लिए क्या, आप नोटपैड में एक बार कोड टाइप करते हैं (और सचिव को स्पेलिंग त्रुटियों को टिप्पणी करने दें);) वास्तविक प्रोग्रामर को आईडीई की आवश्यकता नहीं है। भयानक कटाक्ष के लिए – TomTom

+0

+1 – Darcy

0

आप जब आप जानते हैं इस का मूल्य बाहर अपने आवेदन के माध्यम से स्थिर रहेंगे "स्थिरांक" के रूप में एक चर परिभाषित करना चाहिए। तो एक बार जब आप एक कॉन्स को परिभाषित करते हैं, तो यह मान संकलन समय पर निर्धारित होना चाहिए और यह मान असेंबली के मेटाडेटा में सहेजा जाएगा। कॉन्स:

  1. एक कॉन्स केवल उन प्रकारों के लिए परिभाषित किया जा सकता है जो आपके कंपाइलर प्राथमिक प्रकार के रूप में व्यवहार करते हैं।
  2. कॉन्स्टेंट को हमेशा परिभाषित प्रकार का हिस्सा माना जाता है।
  3. उन्हें हमेशा स्टेटिक सदस्य माना जाता है।
  4. स्थिरांक मान हमेशा कोड में सीधे एम्बेडेड होते हैं, इसलिए स्थिरांक को रन टाइम पर उन्हें आवंटित करने की आवश्यकता नहीं होती है।
मेटाडाटा में मूल्य के इस एम्बेडिंग की वजह से

, जब कोई संस्करण या कुछ अन्य आवश्यकता तो dll के उपयोगकर्ता के लिए है की वजह से (विधानसभा जहां स्थिरांक परिभाषित किया गया है में) स्थिरांक का मूल्य बदल अपनी खुद की असेंबली recompile। और "readonly" कीवर्ड का उपयोग करके इस मुद्दे से बचा जा सकता है।

1

कड़ाई से बोलते हुए, "कॉन्स्ट" आवश्यक नहीं है। उदाहरण के लिए, पायथन, न तो "const" और न ही "निजी" है; आप THIS_IS_A_CONSTANT और _this_is_private के नामकरण सम्मेलन के साथ अपना इरादा निर्दिष्ट करते हैं।

सी #, तथापि, संकलन समय के बजाय कार्यावधि में त्रुटियों को पकड़ने की एक डिजाइन दर्शन है।

1

सभी पठनीयता के बारे में, प्रोग्रामर के लिए अलग अलग अर्थ विज्ञान सच है और आप इसके बारे में सभी जानते हैं चाहिए।

लेकिन सी # में स्थिरांक (बल्कि अंदर।नेट) सामान्य चर के मुकाबले बहुत अलग अर्थशास्त्र (कार्यान्वयन के मामले में) है।

क्योंकि निरंतर मूल्य कभी नहीं बदलता है, स्थिरांक को हमेशा परिभाषित प्रकार का हिस्सा माना जाता है। दूसरे शब्दों में, स्थिरांक को हमेशा स्थिर सदस्य माना जाता है, उदाहरण सदस्यों नहीं। निरंतर परिभाषित मेटाडेटा के निर्माण का कारण बनता है। जब कोड निरंतर प्रतीक को संदर्भित करता है, तो संकलक उत्सर्जित इंटरमीडिएट भाषा (आईएल) कोड में मान एम्बेड करते हैं।

इन बाधाओं का मतलब है कि स्थिरांक में एक अच्छी क्रॉस-असेंबली संस्करणिंग कहानी नहीं है, इसलिए आपको केवल तभी उपयोग करना चाहिए जब आप जानते हैं कि प्रतीक का मूल्य कभी नहीं बदलेगा।