C# में, const और readonly दोनों कीवर्ड का उपयोग अपरिवर्तनीय मानों को परिभाषित करने के लिए किया जाता है, जिन्हें घोषित किए जाने के बाद संशोधित नहीं किया जा सकता है। हालांकि, दोनों के बीच कुछ महत्वपूर्ण अंतर हैं।
स्थिरांक
कॉन्स संशोधक निरंतर मूल्यों की घोषणा करता है जो संकलन-समय पर ज्ञात होते हैं और बदलते नहीं हैं, यानी वे अपरिवर्तनीय हैं। सी # में, आप केवल अंतर्निहित प्रकारों को कॉन्स के रूप में चिह्नित कर सकते हैं। उपयोगकर्ता-परिभाषित प्रकार जैसे कि कक्षाएं, संरचनाएँ, आदि को स्थिर नहीं किया जा सकता है। साथ ही, वर्ग सदस्य प्रकार जैसे कि विधियाँ, गुण, या ईवेंट को स्थिरांक के रूप में चिह्नित नहीं किया जा सकता है।
घोषणा के दौरान आपको स्थिरांक को इनिशियलाइज़ करना होगा।
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; } }
फ़ील्ड डिक्लेरेशन और किसी भी कंस्ट्रक्टर में एक रीडोनली फ़ील्ड को कई बार असाइन किया जा सकता है। साथ ही, इस्तेमाल किए गए कंस्ट्रक्टर के आधार पर इसके अलग-अलग मान हो सकते हैं।
दोनों के बीच एक महत्वपूर्ण अंतर तब होता है जब एक असेंबली में घोषित एक कॉन्स्टेबल या रीडोनली फ़ील्ड को दूसरी असेंबली में उपयोग किए जाने पर संकलित किया जाता है।
-
कास्ट वैल्यू के मामले में, यह एक खोज-प्रतिस्थापन की तरह है। दूसरी असेंबली की इंटरमीडिएट भाषा में निरंतर मान 'बेक्ड इन' होता है। इसका मतलब यह है कि अगर आप स्थिरांक को अपडेट करते हैं, तो दूसरी असेंबली का पहला मान तब तक रहेगा जब तक आप इसे फिर से कंपाइल नहीं करते।
-
केवल पढ़ने योग्य मान के मामले में, यह स्मृति स्थान के संदर्भ की तरह है। मान दूसरी असेंबली की मध्यवर्ती भाषा में बेक नहीं किया गया है। इसका मतलब यह है कि यदि स्मृति स्थान अद्यतन किया जाता है, तो दूसरी असेंबली को बिना किसी संकलन के नया मान मिलता है। केवल पढ़ने योग्य फ़ील्ड को अपडेट करने का मतलब है कि केवल पहली असेंबली को संकलित करने की आवश्यकता है, बिना किसी उपयोगकर्ता असेंबली को संकलित किए।
उदाहरण
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