2010-03-25 10 views
21

मैं एक कॉन्स चर और स्थिर चर के बीच अंतर जानने के लिए उत्सुक हूं।सी # में कॉन्स और स्टेटिक के बीच क्या अंतर है?

जहां तक ​​मुझे पता है कि एक कॉन्स भी स्थैतिक है और आवृत्ति चर पर उपयोग नहीं किया जा सकता है जो स्थिर की तरह ही है, तो उनके बीच क्या अंतर है?

कृपया व्याख्या ... के बाद यह घोषित किया गया है, जबकि एक निरंतर नहीं कर सकते

+9

ऐसी कोई चीज नहीं है जो एक स्थिर चर है। –

उत्तर

29

const फ़ील्ड केवल मूल्य प्रकार या System.String रख सकते हैं। वे संकलन समय पर अपरिवर्तनीय और हल करने योग्य होना चाहिए।

static readonly फ़ील्ड आमतौर पर होल्ड संदर्भ प्रकार कर सकते हैं, जो (स्ट्रिंग्स के अलावा) केवल रनटाइम पर ही बनाए जा सकते हैं। ये म्यूटेबल प्रकार हो सकते हैं (लेकिन नहीं होना चाहिए); एकमात्र चीज जो बदल नहीं सकती वह संदर्भ ही है।

यदि आपको संदर्भ प्रकारों के "निरंतर" सेट को बनाए रखने की आवश्यकता है, तो आप आमतौर पर इसे के सदस्यों जैसे public static readonly फ़ील्ड के सेट के साथ करते हैं।

इतना ही नहीं बल्कि, एक readonly क्षेत्र के प्रारंभ एक निर्माता के निष्पादन, जिसका अर्थ है कि यह भले ही यह केवल एक बार करने के लिए लिखा जा सकता है जब तक आस्थगित किया जा सकता है, यह हमेशा के साथ प्रारंभ की जरूरत नहीं है सटीक वही मूल्य। const के साथ घोषित सच्चे स्थिरांक में केवल एक ही मूल्य हो सकता है (संकलन समय पर निर्दिष्ट)।

+1

इसके अलावा एक स्थिर पाठक को कन्स्ट्रक्टर में बदला जा सकता है, इसलिए अलग-अलग रचनाकार स्थिर पाठ क्षेत्र के लिए अलग-अलग मान प्रदान कर सकते हैं। –

+0

@ जेफ: मैं जोएल नहीं हूं। : पी – Aaronaught

2

एक (गैर-ओनली) स्थिर बदला जा सकता है। इसके अलावा, स्थिरांक को एक फ़ंक्शन का उपयोग करके सेट नहीं किया जा सकता है जबकि स्थिर चर हो सकता है।

6

आप कहते हैं के रूप में, दोनों स्थिर और स्थिरांक एक प्रकार के बजाय एक प्रकार का एक उदाहरण से जुड़े होते हैं। हालांकि, आप अभी भी स्थिर वस्तुओं को बदल सकते हैं। आप कॉन्स आइटम नहीं बदल सकते हैं।

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

+0

यह सही नहीं लगता है। स्टेटिक भी एक क्षेत्र पर मान्य है। और एकमात्र संभावित कॉन्स संदर्भ प्रकार एक स्ट्रिंग है। आप एक स्ट्रिंग नहीं बदल सकते हैं। –

+0

यह भी ध्यान देने योग्य है कि केवल दो संदर्भ प्रकारों को एक कॉन्स पकड़ सकता है स्ट्रिंग और शून्य –

+0

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

11

एक सूक्ष्म लेकिन महत्वपूर्ण अंतर यह है कि consts संकलन समय पर मूल्यांकन किया जाता है, जबकि statics का मूल्यांकन रन टाइम पर किया जाता है। इसका संस्करणांकन पर एक महत्वपूर्ण प्रभाव पड़ता है। उदाहरण के लिए, मान लीजिए आप लिखें:

public const int MaxValue = 100; 

आप संकलित करके उसे अपने विधानसभा (विधानसभा ए) जहाज। फिर कोई और एक असेंबली (असेंबली बी) लिखता है जो मैक्सवेल्यू का संदर्भ देता है। इस मामले में, मूल्य 100 को उनकी असेंबली के साथ-साथ आपकी भी संकलित किया जाता है।

यदि आप लिखा था इस:

public static readonly int MaxValue = 100; 

फिर उनके विधानसभा में संदर्भ सिर्फ इतना है कि, एक संदर्भ रहेगा। जब कोई विधानसभा बी चलाता है, तो मूल्य 100 से असेंबली, असेंबली ए

उदाहरण के लिए, सरल पैचिंग परिदृश्यों को प्रभावित कर सकता है।यदि आप एक अद्यतन असेंबली ए जारी करते हैं जहां मैक्सवैल्यू को 200 के रूप में घोषित किया जाता है, और उपयोगकर्ता पिछले संस्करण पर उस संस्करण की प्रतिलिपि बनाता है (लेकिन असेंबली बी को पुन: संकलित नहीं करता है), तो पहले परिदृश्य में असेंबली बी चालू रहेगा जैसे मैक्सवेल्यू 100 थे, क्योंकि यह const मान है जिसे असेंबली बी में संकलित किया गया था। दूसरे परिदृश्य में, असेंबली बी नए मान को उठाएगा क्योंकि यह रनटाइम पर गैर-कॉन्स static चर लोड करता है।

0

एक स्थिर एक चर है जिसे मूल्य में बदला नहीं जा सकता है।

एक स्थैतिक एक चर है जिसका उपयोग इसकी घोषणा के दायरे से बाहर नहीं किया जा सकता है। यही है, अगर यह एक वैश्विक चर है तो यह केवल उस फ़ाइल में उपयोग किया जा सकता है जो इसे घोषित करता है। यदि यह किसी फ़ंक्शन के अंदर एक चर है, तो यह केवल उस फ़ंक्शन के अंदर उपयोग किया जा सकता है।

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