C# में Const vs Readonly: क्या अंतर है और कब क्या उपयोग करें?
\n\nC# का हर डेवलपर कभी न कभी इस दुविधा का सामना करता है: मान को const या readonly के रूप में घोषित करें? पहली नज़र में, दोनों कीवर्ड एक ही काम करते हैं — इनिशियलाइज़ेशन के बाद वेरिएबल में बदलाव को रोकना। लेकिन गहराई में जाएँ — और अंतरों की एक पूरी खाई खुल जाती है, जो आर्किटेक्चर, प्रदर्शन और यहाँ तक कि कोड सुरक्षा को प्रभावित करती है।
इस लेख में, हम केवल दस्तावेज़ीकरण के सूखे तथ्यों को सूचीबद्ध नहीं करेंगे। हम वास्तविक परिदृश्यों का विश्लेषण करेंगे, संभावित समस्याओं को दिखाएँगे और आपको एक सूचित विकल्प बनाने में मदद करेंगे। चलिए शुरू करते हैं!
\n\nC# में const क्या है?
\n\nConst एक संकलन-समय स्थिरांक है। इसका मान संकलन के समय ज्ञात होना चाहिए और रनटाइम में नहीं बदल सकता।
\n\n- \n
- केवल आदिम प्रकार हो सकते हैं:
int,double,string,bool,enumऔरnull। \n - अंतर्निहित रूप से
static— यह प्रकार से संबंधित है, इंस्टेंस से नहीं। \n - मान सीधे संकलन चरण में कोड में डाला जाता है (C++ में मैक्रो की तरह)। \n
newया संदर्भ प्रकारों (stringको छोड़कर) के साथ उपयोग नहीं किया जा सकता। \n
public class MathConstants\n{\n public const double Pi = 3.14159;\n public const int MaxRetries = 5;\n public const string AppName = "MyApp";\n \n // त्रुटि! संदर्भ प्रकार (string को छोड़कर) नहीं हो सकते\n // public const List<int> Numbers = new List<int>();\n}\n\nजब कंपाइलर const देखता है, तो वह सचमुच मान को IL-कोड में एम्बेड करता है। इसका मतलब है कि यदि आप किसी अन्य असेंबली से कॉन्स्टेंट का उपयोग करते हैं, और बाद में इसका मान बदलते हैं, तो पुरानी असेंबली अभी भी पुराने मान का उपयोग करेंगी — जब तक कि उन्हें पुनः संकलित नहीं किया जाता।
C# में readonly क्या है?
\n\nReadonly एक फ़ील्ड है जिसे केवल घोषणा के समय या क्लास के कंस्ट्रक्टर में इनिशियलाइज़ किया जा सकता है। उसके बाद इसे बदला नहीं जा सकता।
\n\n- \n
- किसी भी प्रकार का हो सकता है: मान प्रकार और संदर्भ प्रकार दोनों। \n
- स्टैटिक या इंस्टेंस दोनों हो सकता है। \n
- मान रनटाइम में गणना किया जाता है (उदाहरण के लिए,
newया विधि कॉल का उपयोग किया जा सकता है)। \n - कोड में एम्बेड नहीं किया जाता — यह लेखन-सुरक्षा वाला एक सामान्य फ़ील्ड है। \n
public class Config\n{\n public readonly DateTime CreatedAt = DateTime.Now;\n public readonly List<string> Tags;\n public static readonly Guid InstanceId = Guid.NewGuid();\n \n public Config()\n {\n Tags = new List<string> { "csharp", "tutorial" };\n // त्रुटि! कंस्ट्रक्टर के बाद बदला नहीं जा सकता\n // Tags = new List<string>();\n }\n}\n\nएक महत्वपूर्ण बारीकी: readonly केवल संदर्भ की रक्षा करता है, ऑब्जेक्ट की सामग्री की नहीं। यदि आपके पास readonly List<int> है, तो आप एक नई सूची निर्दिष्ट नहीं कर सकते, लेकिन आप आसानी से तत्व जोड़ या हटा सकते हैं।
const और readonly की तुलना: अंतरों की तालिका
\n\nसामग्री को मजबूत करने के लिए, यहाँ एक दृश्य तुलना है:
\n\n| मापदंड | \nconst | \nreadonly | \n
|---|---|---|
| गणना का समय | \nसंकलन | \nनिष्पादन (रनटाइम) | \n
| डेटा प्रकार | \nकेवल आदिम + string | \nकोई भी प्रकार | \n
| स्थैतिकता | \nअंतर्निहित रूप से static | \nstatic या instance हो सकता है | \n
| परिवर्तनशीलता | \nकभी नहीं | \nकेवल कंस्ट्रक्टर में | \n
| पहुँच | \nजैसा
ब्लॉगपुस्तक अनुशंसाएँयह भी पढ़ें |