दिलचस्प पोस्ट
PHP 7.2 में मैक्रिप को हटाने की तैयारी एंड्रॉइड एल (एपीआई 21) – java.lang.IllegalArgumentException: सेवा आशय स्पष्ट होना चाहिए क्या मैं उप फ़ोल्डर्स सहित किसी फ़ोल्डर में सभी आउटलुक ईमेलों के माध्यम से दोहरा सकता हूं? एंड्रॉइड में स्ट्रिंग.एक्सएम से मूल्य कैसे पढ़ें? जब @ जेसनप्रॉपर्टी प्रॉपर्टी का उपयोग किया जाता है और इसके लिए क्या उपयोग किया जाता है? स्थैतिक आयात को शामिल करने के लिए एक्लिप्स ऑप्टीमाइज़ आयात एनपीएम पैकेज को समझना @ -prefix: @ कोणीय / राउटर निर्भरता प्रॉपर्टी गेटर / सेटर को फोन नहीं किया जा रहा है एचटीटीपीआरएल कनेक्शन ने एंड्रॉइड 2.x में ठीक काम किया लेकिन 4.1 में नहीं: कोई प्रमाणीकरण चुनौतियां नहीं मिलीं पायथन मॉड्यूल और एक पायथन पैकेज के बीच क्या अंतर है? मैं mysqldump से एक डंप फ़ाइल को कैसे पुनर्स्थापित करूं? पहले एसडीके संस्करणों में एक्शनबार के बराबर क्या है? क्या बारंबार लूपिंग से कहीं ज्यादा तेज़ है? कैसे मेरे लेआउट को ऊपर धक्का नरम कीबोर्ड से बचने के लिए? उत्तरदायी बूटस्ट्रैप navbar में केंद्र सामग्री

Const और पठनीय के बीच अंतर क्या है?

const और readonly बीच अंतर क्या है और क्या आप दूसरे पर एक का उपयोग करते हैं?

वेब के समाधान से एकत्रित समाधान "Const और पठनीय के बीच अंतर क्या है?"

इसके स्पष्ट अंतर के अलावा

  • एक const VS के लिए परिभाषा के समय मूल्य को घोषित करने के लिए readonly मानों को गतिशील रूप से गिना जा सकता है लेकिन कन्स्ट्रक्टर के बाहर आने से पहले उसे सौंपा जाना जरूरी है .. उसके बाद यह जमी है
  • 'कंस्ट्रल पूरी तरह static आप उन तक पहुंचने के लिए ClassName.ConstantName का उपयोग करते हैं।

एक सूक्ष्म अंतर है AssemblyA ए में परिभाषित क्लास पर विचार करें

 public class Const_V_Readonly { public const int I_CONST_VALUE = 2; public readonly int I_RO_VALUE; public Const_V_Readonly() { I_RO_VALUE = 3; } } 

AssemblyB संदर्भ देता है और कोड में इन मानों का उपयोग करता है। जब इसे संकलित किया जाता है,

  • const मान के मामले में, यह एक खोज-प्रतिस्थापन की तरह है, मान 2 को 'बेक किया गया है' जो AssemblyB के आईएल है इसका मतलब यह है कि अगर कल भविष्य में I_CONST_VALUE से 20 तक अपडेट करूँगा I जब तक मैं इसे पुनः कंपाइल नहीं करता हूं, तब भी AssemblyB बी 2 होगा
  • readonly वैल्यू के मामले में, यह मेमोरी स्थान के लिए ref जैसा है। मान AssemblyB के आईएल में बेक नहीं है इसका मतलब यह है कि अगर मेमोरी स्थान अपडेट हो जाता है, तो AssemblyB को पुन: संसंवकरण के बिना नया मान मिलता है। इसलिए यदि I_RO_VALUE को 30 में अपडेट किया गया है, तो आपको केवल AssemblyA I_RO_VALUE को बनाने की आवश्यकता है सभी ग्राहकों को पुनः कंपाइल होने की ज़रूरत नहीं है

इसलिए यदि आपको विश्वास है कि निरंतर का मान एक const उपयोग नहीं करेगा

 public const int CM_IN_A_METER = 100; 

लेकिन अगर आपके पास एक स्थिरता है जो बदल सकती है (egwrt सटीकता) .. या जब संदेह में, readonly उपयोग करें

 public readonly float PI = 3.14; 

अद्यतन: Aku को एक उल्लेख coz मिलनी चाहिए वह इस बाहर पहली बार बताया। इसके अलावा मुझे प्लग करना होगा जहां मैंने यह सीखा .. प्रभावी सी # – बिल वैगनर

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

स्थिरांक

  • स्थिर डिफ़ॉल्ट रूप से स्थिर हैं
  • संकलन-समय पर उनके पास मूल्य होना चाहिए (जैसे आप 3.14 * 2 हो सकते हैं, लेकिन तरीकों को कॉल नहीं कर सकते हैं)
  • कार्यों के भीतर घोषित किया जा सकता है
  • उन प्रत्येक विधानसभा में प्रतिलिपि बनाई जाती हैं जो उनका उपयोग करती हैं (प्रत्येक विधानसभा को मूल्यों की एक स्थानीय प्रति प्राप्त होती है)
  • विशेषताओं में उपयोग किया जा सकता है

केवल पढ़ने के लिए उदाहरण फ़ील्ड

  • निर्धारित मूल्य निर्धारित करना चाहिए, समय निर्माता द्वारा निकलता है
  • उदाहरण बनता है जब मूल्यांकन किया जाता है

स्टेटिक रीडोनली फील्ड

  • कोड निष्पादन वर्ग के संदर्भ में हिट हो जाने पर मूल्यांकन किया जाता है (जब नया उदाहरण बनाया जाता है या एक स्थिर विधि निष्पादित होती है)
  • स्थैतिक कन्स्ट्रक्टर के द्वारा किए गए मूल्यांकन के अनुसार मूल्यांकन मूल्य होना चाहिए
  • इन पर थ्रेडस्टाटिक एटिट्यूड डाल करने की अनुशंसा नहीं की जाती है (स्थैतिक कन्स्ट्रक्टर केवल एक धागे में निष्पादित होंगे और इसके थ्रेड के लिए मान सेट करेंगे; अन्य सभी थ्रेड्स में इस मूल्य को अनिर्धारित किया जाएगा)

केवल संदर्भ प्रकारों के लिए, केवल पढ़ने के लिए, संदर्भ केवल पढ़ने योग्य नहीं मान ही मानता है। उदाहरण के लिए:

 public class Const_V_Readonly { public const int I_CONST_VALUE = 2; public readonly char[] I_RO_VALUE = new Char[]{'a', 'b', 'c'}; public UpdateReadonly() { I_RO_VALUE[0] = 'V'; //perfectly legal and will update the value I_RO_VALUE = new char[]{'V'}; //will cause compiler error } } 

यह बताता है कि यह सारांश: कॉन्स्ट्र को घोषणा समय पर आरंभ किया जाना चाहिए, कंसट्रक्टर पर केवल पढ़ने के लिए आरंभीकृत किया जा सकता है (और इस प्रकार इस निर्माता के आधार पर भिन्न मान है)।

संपादित करें: सूक्ष्म अंतर के लिए ऊपर गिशू की पकड़ो देखें

const : कहीं भी नहीं बदला जा सकता

readonly : यह मान केवल कन्स्ट्रक्टर में बदल सकता है। सामान्य कार्यों में बदला नहीं जा सकता

केवल पढ़ने के लिए एक छोटी पकड़ है कंस्ट्रक्टर (ओं) के भीतर एक पठनीय फ़ील्ड को कई बार सेट किया जा सकता है भले ही मूल्य दो अलग-अलग संरेखित कन्स्ट्रक्शंस में सेट हो, यह अभी भी अनुमति है।

 public class Sample { private readonly string ro; public Sample() { ro = "set"; } public Sample(string value) : this() { ro = value; // this works even though it was set in the no-arg ctor } } 

एक const एक संकलन समय स्थिर है, जबकि केवल पढ़ने के लिए मूल्य को रन-टाइम पर गणना करने की अनुमति देता है और कन्स्ट्रक्टर या फील्ड प्रारंभकर्ता में सेट किया जाता है। इसलिए, एक 'const' हमेशा स्थिर होता है लेकिन 'केवल पढ़ने के लिए' एक बार इसे सौंपा जाने के बाद पढ़ा जाता है।

सी # टीम के एरिक लिपर ने विभिन्न प्रकार की अपरिवर्तनीयता के बारे में अधिक जानकारी दी है

यहाँ एक और कड़ी है जो दिखाती है कि const कैसे संस्करण सुरक्षित नहीं है, या संदर्भ प्रकारों के लिए प्रासंगिक है।

सारांश :

  • आपकी कॉन्स्ट प्रॉपर्टी का मान संकलन समय पर सेट होता है और रनटाइम पर बदल नहीं सकता
  • Const स्थैतिक के रूप में चिह्नित नहीं किया जा सकता है – कीवर्ड का मतलब ये है कि वे स्थिर हैं, जो कि रीडोनली फ़ील्ड के विपरीत नहीं हो सकते हैं।
  • Const मूल्य (आदिम) प्रकारों के अलावा कुछ भी नहीं हो सकता
  • रीडोनली कीवर्ड फ़ील्ड को अपरिवर्तनीय के रूप में चिन्हित करता है। हालांकि संपत्ति को कक्षा के निर्माता के अंदर बदला जा सकता है
  • केवल पढ़ने के लिए एकमात्र कीवर्ड को स्थिर के साथ जोड़ा जा सकता है ताकि यह एक const (सतह पर कम से कम) के समान ही कार्य करे। जब आप दोनों के बीच आईएल को देखते हैं तो एक महत्वपूर्ण अंतर है
  • कॉन्स्ट फ़ील्ड आईएल में "शाब्दिक" के रूप में चिह्नित हैं जबकि केवल पढ़ने के लिए "initonly"

एक निरंतर सदस्य को समय संकलन पर परिभाषित किया जाता है और रनटाइम पर बदला नहीं जा सकता। कॉन्स्टेंट को const कीवर्ड का उपयोग करके एक फ़ील्ड के रूप में घोषित किया जाता है और उन्हें घोषित किए जाने के बाद आरंभ किया जाना चाहिए।

 public class MyClass { public const double PI1 = 3.14159; } 

एक readonly सदस्य एक निरंतर जैसा है जिसमें यह एक अपरिवर्तनीय मूल्य का प्रतिनिधित्व करता है अंतर यह है कि एक readonly सदस्य को रनटाइम पर शुरू किया जा सकता है, कन्स्ट्रक्टर में, साथ ही इन्हें शुरू होने में सक्षम होने के साथ ही उन्हें घोषित किया जा सकता है।

 public class MyClass1 { public readonly double PI2 = 3.14159; //or public readonly double PI3; public MyClass2() { PI3 = 3.14159; } } 

स्थिरांक

  • उन्हें static रूप में घोषित नहीं किया जा सकता है (वे निहित हैं स्थिर)
  • संकलन के समय निरंतर का मूल्य मूल्यांकन किया जाता है
  • स्थिरता केवल घोषणा पर आरंभ की जाती हैं

सिफ़ पढ़िये

  • वे या तो उदाहरण-स्तर या स्थिर हो सकते हैं
  • मूल्य रन टाइम पर मूल्यांकन किया जाता है
  • रीडॉनली को घोषणा में या कन्स्ट्रक्टर में कोड द्वारा आरंभीकृत किया जा सकता है

फिर भी एक और पकड़: प्रतिबिंब के माध्यम से "कुटिल" कोड द्वारा पठनीय मूल्यों को बदला जा सकता है

 var fi = this.GetType() .BaseType .GetField("_someField", BindingFlags.Instance | BindingFlags.NonPublic); fi.SetValue(this, 1); 

क्या मैं प्रतिबिंब के द्वारा सी # में निजी रीडोनली विरासत फ़ील्ड बदल सकता हूँ?

मेरा मानना ​​है कि एक const मूल्य सभी वस्तुओं के लिए समान है (और इसे एक शाब्दिक अभिव्यक्ति के साथ आरंभ किया जाना चाहिए), जबकि प्रत्येक पल के लिए readonly लिए अलग-अलग हो सकता है …

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

इसके अलावा, कॉन्स्ट वैरिएम स्वाभाविक रूप से स्थिर हैं, जबकि वांछित पाठ केवल वैसा ही विशिष्ट हो सकते हैं।

कन्वेंशन कीवर्ड कंसटेंट से अलग है। एक कॉन्स्ट फ़ील्ड केवल क्षेत्र की घोषणा पर आरंभ किया जा सकता है। एक पठन-योग्य फ़ील्ड या तो घोषणा या कन्स्ट्रक्टर में शुरू किया जा सकता है इसलिए, उपयोग किए गए कन्स्ट्रक्टर के आधार पर केवल पढ़ने के लिए फ़ील्ड में भिन्न मान हो सकते हैं इसके अलावा, जब एक कंस्ट्रक्शन फ़ील्ड एक कंपाइल-टाइम स्थिर होता है, तो रीडोनली फ़ील्ड को रनटाइम स्थिरांक के लिए निम्न उदाहरण के रूप में इस्तेमाल किया जा सकता है:

 public static readonly uint l1 = (uint) DateTime.Now.Ticks; 

एक और पकड़ लिया

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

तो सोच में उलझन में मत रहो कि केवल पढ़ने के लिए इसका मतलब है कि कोई उपयोगकर्ता चीज़ों को बदल नहीं सकता है। क्लास के आंतरिक मूल्यों को परिवर्तित करने से रोकने के लिए सी # में कोई सरल सिंटैक्स नहीं है (जहां तक ​​मुझे पता है)।

हमारे कार्यालय में टीम सदस्यों में से एक ने कॉन्स्ट, स्थिर, और केवल पढ़ने के लिए उपयोग करने पर निम्नलिखित मार्गदर्शन प्रदान किया है:

  • जब आप एक प्रकार के एक चर का उपयोग करें जिसे आप रनटाइम (स्ट्रिंग, शाब्दिक, इंटेल, डबल, एनम, …) में जानते हैं, तो आप सभी उदाहरणों या किसी ग्राहक के उपभोक्ताओं को उस स्थान तक पहुंच प्राप्त करना चाहते हैं जहां मूल्य परिवर्तित नहीं होना चाहिए।
  • जब आपके पास डेटा होता है, तब स्थिर स्थिति का उपयोग करें, जिसे आप सभी उदाहरणों या किसी ग्राहक के उपभोक्ता चाहते हैं जहां तक ​​मूल्य बदल सकता है।
  • स्थिर पाठ का उपयोग करें जब आपके पास एक प्रकार का एक चर है जिसे आप रनटाइम (ऑब्जेक्ट्स) में नहीं जान सकते हैं, जिसे आप सभी उदाहरणों या किसी ग्राहक के उपभोक्ताओं को उस स्थान तक पहुंच प्राप्त करना चाहते हैं जहां मूल्य परिवर्तित नहीं होना चाहिए।
  • जब आपके पास एक इन्ससेंस स्तरीय वेरिएबल होता है जो आप ऑब्जेक्ट सृजन के समय में बदलते हैं, तो उसे पढ़ने के लिए उपयोग करें।

एक अंतिम नोट: एक कॉन्स्ट फ़ील्ड स्थिर है, लेकिन उलटा सच नहीं है।

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

उदाहरण:

 public static class Text { public const string ConstDescription = "This can be used."; public readonly static string ReadonlyDescription = "Cannot be used."; } public class Foo { [Description(Text.ConstDescription)] public int BarThatBuilds { { get; set; } } [Description(Text.ReadOnlyDescription)] public int BarThatDoesNotBuild { { get; set; } } } 

केवल पढ़ने के लिए : मूल्य समय पर सीटीआर के माध्यम से बदला जा सकता है लेकिन सदस्य फ़ंक्शन के माध्यम से नहीं

लगातार : स्थिर defult द्वारा मूल्य को कहीं से भी बदला नहीं जा सकता (Ctor, Function, Runtime etc no-where)

कंसल्टेंट और रीडोनली फ़ील्ड सी # नेट में अंतर है

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

 public const DateTime dt = DateTime.Today; //throws compilation error public const string Name = string.Empty; //throws compilation error public readonly string Name = string.Empty; //No error, legal 

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

 class A { public readonly int Id; public A(int i) { Id = i; } } 

फिर पठन-योग्य क्षेत्र तत्काल विशिष्ट मूल्यों के साथ आरंभ किया जा सकता है, निम्नानुसार:

 A objOne = new A(5); A objTwo = new A(10); 

यहाँ, उदाहरण objOne के रूप में 5 के रूप में readonly क्षेत्र का मूल्य होगा और objTwo 10 है। कौन const उपयोग कर संभव नहीं है

लगातार

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

सिफ़ पढ़िये

रीडऑनली फ़ील्ड केवल रनटाइम पर हल किए जा सकते हैं इसका मतलब है कि हम उस प्रकार के लिए एक मान के लिए एक मान परिभाषित कर सकते हैं जिस प्रकार फ़ील्ड को घोषित किया गया है। सत्यापन कंपाइलर द्वारा किया जाता है जो कि रीडरली फ़ील्ड को कन्स्ट्रक्टर के अलावा किसी अन्य तरीके से नहीं लिखा जाता है।

दोनों के बारे में अधिक इस लेख में समझाया

कन्वेंशन कीवर्ड कंसटेंट से अलग है। एक कॉन्स्ट फ़ील्ड केवल क्षेत्र की घोषणा पर आरंभ किया जा सकता है। एक पठन-योग्य फ़ील्ड या तो घोषणा या कन्स्ट्रक्टर में शुरू किया जा सकता है इसलिए, उपयोग किए गए कन्स्ट्रक्टर के आधार पर केवल पढ़ने के लिए फ़ील्ड में भिन्न मान हो सकते हैं इसके अलावा, जब एक कंस्ट्रक्शन फ़ील्ड एक कंपाइल-टाइम स्थिर होता है, तो रीडोनली फ़ील्ड को रनटाइम स्थिरांक के लिए निम्न उदाहरण के रूप में इस्तेमाल किया जा सकता है:

 public static readonly uint timeStamp = (uint)DateTime.Now.Ticks; 

मुख्यतः; आप एक स्थिर रीडोनली फ़ील्ड के लिए रनटाइम पर एक गैर-निरंतर मान के लिए एक मान निर्दिष्ट कर सकते हैं, जबकि एक कॉन्स्ट को एक स्थिर मूल्य निर्दिष्ट किया जाना है।

एक स्थिर उपभोक्ता को एक शाब्दिक मूल्य के रूप में संकलित किया जाएगा, जबकि स्थिर स्ट्रिंग परिभाषित मूल्य के संदर्भ के रूप में काम करेगा।

एक अभ्यास के रूप में, एक बाहरी पुस्तकालय बनाने का प्रयास करें और इसे कंसोल में उपयोग करें, फिर लाइब्रेरी में मानों को बदल दें और इसे पुनः कंपाइल करें (उपभोक्ता प्रोग्राम को पुनः कंपाइल किए बिना), डीएलएल को डायरेक्टरी में छोड़ दें और मैन्युअल रूप से EXE को चलाने दें, आपको मिलना चाहिए कि निरंतर स्ट्रिंग बदल नहीं है

एक const को कठिन कोडित करना पड़ता है, जहां readonly रूप में कक्षा के निर्माता में सेट किया जा सकता है।

Const और पठनीय समान हैं, लेकिन वे वास्तव में समान नहीं हैं। एक कॉन्स्ट फ़ील्ड एक संकलित समय स्थिर है, जिसका अर्थ है कि उस मूल्य को संकलन-समय पर गणना किया जा सकता है। एक पठन-योग्य क्षेत्र अतिरिक्त परिदृश्य में सक्षम होता है जिसमें कुछ कोड प्रकार के निर्माण के दौरान चलना चाहिए। निर्माण के बाद, एक पठनीय फ़ील्ड को बदला नहीं जा सकता।

उदाहरण के लिए, कॉन्स्ट सदस्यों का उपयोग सदस्यों को परिभाषित करने के लिए किया जा सकता है जैसे:

 struct Test { public const double Pi = 3.14; public const int Zero = 0; } 

चूंकि 3.14 और 0 जैसी मान संकलन-समय स्थिर हैं। हालांकि, उस स्थिति पर विचार करें जहां आप एक प्रकार को परिभाषित करते हैं और इसके कुछ पूर्व-फैब उदाहरण प्रदान करना चाहते हैं। उदाहरण के लिए, आप एक रंग वर्ग को परिभाषित करना चाहते हैं और काले, सफेद, आदि जैसे सामान्य रंगों के लिए "स्थिरांक" प्रदान करना चाहते हैं। ऐसा करने के लिए कॉन्स्ट सदस्यों के साथ ऐसा करना संभव नहीं है, क्योंकि दाहिने हाथ की ओर संकलन-समय स्थिर नहीं होते हैं एक नियमित स्थिर सदस्यों के साथ ऐसा कर सकता है:

 public class Color { public static Color Black = new Color(0, 0, 0); public static Color White = new Color(255, 255, 255); public static Color Red = new Color(255, 0, 0); public static Color Green = new Color(0, 255, 0); public static Color Blue = new Color(0, 0, 255); private byte red, green, blue; public Color(byte r, byte g, byte b) { red = r; green = g; blue = b; } } 

लेकिन फिर इसके साथ मुस्कुराते हुए रंग के ग्राहक रखने के लिए कुछ भी नहीं है, शायद काले और सफेद मूल्यों को गमागमन करके। कहने की जरूरत नहीं है, यह रंग क्लास के अन्य क्लाइंटों के लिए भयावहता का कारण होगा। "पठन केवल" सुविधा इस परिदृश्य को संबोधित करती है घोषणाओं में केवल पढ़ने वाले शब्दों को शुरू करने से, हम ग्राहक के कोड को रोकने के दौरान लचीला प्रारंभिकता को संरक्षित करते हैं।

 public class Color { public static readonly Color Black = new Color(0, 0, 0); public static readonly Color White = new Color(255, 255, 255); public static readonly Color Red = new Color(255, 0, 0); public static readonly Color Green = new Color(0, 255, 0); public static readonly Color Blue = new Color(0, 0, 255); private byte red, green, blue; public Color(byte r, byte g, byte b) { red = r; green = g; blue = b; } } 

यह ध्यान रखना दिलचस्प है कि const सदस्य हमेशा स्थिर होते हैं, जबकि एक रीडोनली सदस्य या तो स्थिर हो सकता है या नहीं, सिर्फ एक नियमित क्षेत्र की तरह।

इन दोनों उद्देश्यों के लिए एक एकल कीवर्ड का उपयोग करना संभव है, लेकिन इससे या तो संस्करण समस्याओं या प्रदर्शन समस्याएं बढ़ जाती है एक क्षण के लिए मान लें कि हमने इस (const) के लिए एक एकल कीवर्ड का इस्तेमाल किया है और डेवलपर ने लिखा है:

 public class A { public static const C = 0; } 

और एक अलग डेवलपर ने कोड लिखा था जो ए पर भरोसा था:

 public class B { static void Main() { Console.WriteLine(AC); } } 

अब, जो कोड उत्पन्न होता है, क्या इस तथ्य पर भरोसा कर सकता है कि एसी संकलन-समय स्थिर है? यानी, क्या एसी का इस्तेमाल केवल मान 0 से बदला जा सकता है? यदि आप इस पर "हां" कहते हैं, तो इसका मतलब है कि ए के डेवलपर एसी को आरंभ करने के तरीके को बदल नहीं सकता – यह अनुमति के बिना ए के डेवलपर के हाथों से संबंध रखता है। यदि आप इस प्रश्न के लिए "नहीं" कहते हैं तो एक महत्वपूर्ण अनुकूलन मिट जाता है। शायद ए के लेखक सकारात्मक है कि एसी हमेशा शून्य होगा दोनों const और पढ़ने के लिए उपयोग करने से ए के डेवलपर को इरादा निर्दिष्ट करने की अनुमति मिलती है। यह बेहतर संस्करण व्यवहार और भी बेहतर प्रदर्शन के लिए बनाता है

केवल पढ़ने के लिए: मूल्य केवल क्लास के निर्माता से एक बार आरम्भ किया जाएगा।
const: किसी भी समारोह में शुरू किया जा सकता है, लेकिन केवल एक बार

अंतर यह है कि एक स्थिर पढ़ने के लिए फ़ील्ड का मूल्य रन टाइम पर सेट किया गया है, इसलिए इस कार्यक्रम के विभिन्न फ़ैज़लों के लिए एक अलग मान हो सकता है। हालांकि, कॉन्स्ट फ़ील्ड का मान एक संकलन समय स्थिर पर सेट होता है।

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

विवरण के लिए, कृपया इस विषय पर सी # अक्सर पूछे जाने वाले प्रश्न देखें: http://blogs.msdn.com/csharpfaq/archive/2004/12/03/274791.aspx

संकलित समय पर लगातार चर को घोषित और आरम्भ किया जाता है। वार्डों के बाद मान को बदला नहीं जा सकता। केवल-पढ़ने वाले चर को केवल क्लास के स्टेटिक कन्स्ट्रक्टर से आरंभ किया जाएगा। केवल पढ़ने के लिए तभी उपयोग किया जाता है जब हम मूल्य को समय पर असाइन करना चाहते हैं।

एक कॉन्स्ट फ़ील्ड केवल क्षेत्र की घोषणा पर आरंभ किया जा सकता है। एक पठन-योग्य फ़ील्ड या तो घोषणा या कन्स्ट्रक्टर में शुरू किया जा सकता है

एक बात जो लोग ऊपर कहा है जोड़ने के लिए। यदि आपके पास एक रीडोनली वैल्यू (उदाहरण के लिए केवल पढ़ने वाले मैक्सफूकाउंट = 4;) वाले असेंबली है, तो आप उस मूल्य को बदल सकते हैं जो विधानसभाओं को एक अलग मान के साथ उस विधानसभा का एक नया संस्करण शिपिंग करके देखता है (उदाहरण के लिए, केवल पढ़ने के लिए MaxFooCount = 5;)

लेकिन एक कॉन्स्ट के साथ, कॉलर का कोड संकलित हो जाने पर इसे कॉलर के कोड में जोड़ दिया जाएगा।

यदि आप सी # प्रवीणता के इस स्तर पर पहुंच गए हैं, तो आप बिल वैग्नेर की पुस्तक, प्रभावी सी #: 50 को अपने सी को सुधारने के लिए विशिष्ट तरीके तैयार करने के लिए तैयार हैं, जो इस प्रश्न का विस्तार से विस्तार करते हैं (और 49 अन्य चीजें)।