C# में Const vs Readonly: क्या चुनें और क्या अंतर है?

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C# में Const vs Readonly: क्या अंतर है और कब क्या उपयोग करें?

\n\n

C# का हर डेवलपर कभी न कभी इस दुविधा का सामना करता है: मान को const या readonly के रूप में घोषित करें? पहली नज़र में, दोनों कीवर्ड एक ही काम करते हैं — इनिशियलाइज़ेशन के बाद वेरिएबल में बदलाव को रोकना। लेकिन गहराई में जाएँ — और अंतरों की एक पूरी खाई खुल जाती है, जो आर्किटेक्चर, प्रदर्शन और यहाँ तक कि कोड सुरक्षा को प्रभावित करती है।

\n\n

इस लेख में, हम केवल दस्तावेज़ीकरण के सूखे तथ्यों को सूचीबद्ध नहीं करेंगे। हम वास्तविक परिदृश्यों का विश्लेषण करेंगे, संभावित समस्याओं को दिखाएँगे और आपको एक सूचित विकल्प बनाने में मदद करेंगे। चलिए शुरू करते हैं!

\n\n

C# में const क्या है?

\n\n

Const एक संकलन-समय स्थिरांक है। इसका मान संकलन के समय ज्ञात होना चाहिए और रनटाइम में नहीं बदल सकता।

\n\n
    \n
  • केवल आदिम प्रकार हो सकते हैं: int, double, string, bool, enum और null।
  • \n
  • अंतर्निहित रूप से static — यह प्रकार से संबंधित है, इंस्टेंस से नहीं।
  • \n
  • मान सीधे संकलन चरण में कोड में डाला जाता है (C++ में मैक्रो की तरह)।
  • \n
  • new या संदर्भ प्रकारों (string को छोड़कर) के साथ उपयोग नहीं किया जा सकता।
  • \n
\n\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-कोड में एम्बेड करता है। इसका मतलब है कि यदि आप किसी अन्य असेंबली से कॉन्स्टेंट का उपयोग करते हैं, और बाद में इसका मान बदलते हैं, तो पुरानी असेंबली अभी भी पुराने मान का उपयोग करेंगी — जब तक कि उन्हें पुनः संकलित नहीं किया जाता।

\n\n

C# में readonly क्या है?

\n\n

Readonly एक फ़ील्ड है जिसे केवल घोषणा के समय या क्लास के कंस्ट्रक्टर में इनिशियलाइज़ किया जा सकता है। उसके बाद इसे बदला नहीं जा सकता।

\n\n
    \n
  • किसी भी प्रकार का हो सकता है: मान प्रकार और संदर्भ प्रकार दोनों।
  • \n
  • स्टैटिक या इंस्टेंस दोनों हो सकता है।
  • \n
  • मान रनटाइम में गणना किया जाता है (उदाहरण के लिए, new या विधि कॉल का उपयोग किया जा सकता है)।
  • \n
  • कोड में एम्बेड नहीं किया जाता — यह लेखन-सुरक्षा वाला एक सामान्य फ़ील्ड है।
  • \n
\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> है, तो आप एक नई सूची निर्दिष्ट नहीं कर सकते, लेकिन आप आसानी से तत्व जोड़ या हटा सकते हैं।

\n\n

const और readonly की तुलना: अंतरों की तालिका

\n\n

सामग्री को मजबूत करने के लिए, यहाँ एक दृश्य तुलना है:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
मापदंडconstreadonly
गणना का समयसंकलननिष्पादन (रनटाइम)
डेटा प्रकारकेवल आदिम + stringकोई भी प्रकार
स्थैतिकताअंतर्निहित रूप से staticstatic या instance हो सकता है
परिवर्तनशीलताकभी नहींकेवल कंस्ट्रक्टर में
पहुँचजैसा

ब्लॉग

पुस्तक अनुशंसाएँ