C# में, const और readonly दोनों कीवर्ड अपरिवर्तनीय मानों को परिभाषित करने के लिए उपयोग किए जाते हैं जिन्हें घोषित होने के बाद संशोधित नहीं किया जा सकता। हालांकि, दोनों के बीच कुछ महत्वपूर्ण अंतर हैं।
const
const मॉडिफायर उन स्थिर मानों की घोषणा करता है जो कंपाइल-टाइम पर ज्ञात होते हैं और नहीं बदलते, यानी वे अपरिवर्तनीय हैं। C# में, आप केवल बिल्ट-इन प्रकारों को const के रूप में चिह्नित कर सकते हैं। उपयोगकर्ता-परिभाषित प्रकार जैसे क्लासेस, स्ट्रक्स आदि const नहीं हो सकते। साथ ही, क्लास सदस्य प्रकार जैसे मेथड्स, प्रॉपर्टीज, या इवेंट्स को स्थिरांक के रूप में चिह्नित नहीं किया जा सकता।
आपको घोषणा के दौरान स्थिरांक को आरंभ करना होगा।
class Period{ public const int hours = 12; public const int minutes = 60; }स्थिरांकों को किसी भी विजिबिलिटी मॉडिफायर के साथ चिह्नित किया जा सकता है, यानी private, public, protected, protected internal, या private protected।
स्थिरांक स्थिर मानों के रूप में भी कार्य करते हैं, यानी स्थिरांक का मान क्लास के सभी इंस्टेंस के लिए समान होता है। आपको उन्हें static कीवर्ड के साथ स्पष्ट रूप से चिह्नित करने की आवश्यकता नहीं है। आप क्लास के इंस्टेंस वेरिएबल्स का उपयोग करके स्थिरांक तक नहीं पहुंच सकते बल्कि क्लास नाम का उपयोग करना होगा।
readonly
readonly के रूप में चिह्नित एक फ़ील्ड को केवल घोषणा के दौरान या कंस्ट्रक्टर में असाइन किया जा सकता है। एक बार क्लास का इंस्टेंस बन जाने के बाद, आप readonly फ़ील्ड को संशोधित नहीं कर सकते।
यदि फ़ील्ड एक मूल्य प्रकार है, तो इसे readonly चिह्नित करने से यह अपरिवर्तनीय हो जाता है। दूसरी ओर, यदि एक readonly फ़ील्ड एक संदर्भ प्रकार है, तो आप उस ऑब्जेक्ट के डेटा को बदल सकते हैं जिसे वेरिएबल संदर्भित करता है। हालांकि, आप उस संदर्भ को किसी नए ऑब्जेक्ट पर इंगित करने के लिए नहीं बदल सकते।
class Person{ private readonly string _title; private readonly string _skill; public Person(string title, string skill){ _title = title; _skill = skill; } }एक readonly फ़ील्ड को फ़ील्ड घोषणा में और किसी भी कंस्ट्रक्टर में कई बार असाइन किया जा सकता है। साथ ही, उपयोग किए गए कंस्ट्रक्टर के आधार पर इसके अलग-अलग मान हो सकते हैं।
दोनों के बीच एक महत्वपूर्ण अंतर यह है कि जब एक असेंबली में घोषित const या readonly फ़ील्ड को दूसरी असेंबली में उपयोग किए जाने पर कंपाइल किया जाता है।
const मान के मामले में, यह फाइंड-रिप्लेस जैसा है। स्थिरांक मान दूसरी असेंबली की इंटरमीडिएट लैंग्वेज में 'बेक' हो जाता है। इसका मतलब है कि यदि आप स्थिरांक को अपडेट करते हैं, तो दूसरी असेंबली में तब तक पहला मान रहेगा जब तक आप उसे पुनः कंपाइल नहीं करते।
readonly मान के मामले में, यह मेमोरी लोकेशन का संदर्भ जैसा है। मान दूसरी असेंबली की इंटरमीडिएट लैंग्वेज में बेक नहीं होता। इसका मतलब है कि यदि मेमोरी लोकेशन अपडेट होता है, तो दूसरी असेंबली को पुनर्कंपाइल के बिना नया मान मिल जाता है। readonly फ़ील्ड को अपडेट करने का मतलब है कि केवल पहली असेंबली को कंपाइल करने की आवश्यकता है बिना किसी यूजर असेंबली को कंपाइल किए।
उदाहरण
using System; class Program{ static void Main(){ Console.WriteLine(Period.HOURS); var person = new Person("John", "Programmer"); person.Print(); } } class Period{ public const int HOURS = 12; public const int MINUTES = 60; } class Person{ private readonly string _title; private readonly string _skill; public Person(string title, string skill){ _title = title; _skill = skill; } public void Change(string skill){ // Error: A readonly field cannot be assigned to // this._skill = skill; } public void Print(){ Console.WriteLine($"{_title}: {_skill}"); } }आउटपुट
12 John: Programmer