परिचय: ऑटो-प्रॉपर्टी के सवाल ने हज़ारों व्यूज़ क्यों बटोरे?
\n\nअगर आपने कभी C# में कोड लिखा है, तो आपने एक सरल लेकिन महत्वपूर्ण सवाल ज़रूर देखा होगा: "ऑटो-प्रॉपर्टी को शुरुआती मान कैसे दें?"। Stack Overflow पर इस सवाल ने हज़ारों व्यूज़ बटोरे हैं, और यह कोई संयोग नहीं है। यह जितना सरल लगता है, उतना ही इसमें छिपे खतरे हैं।
\n\nसोचिए: आप एक User क्लास बना रहे हैं, और चाहते हैं कि Name प्रॉपर्टी डिफ़ॉल्ट रूप से null न हो, बल्कि एक खाली स्ट्रिंग हो। इसमें क्या गलत हो सकता है? लेकिन व्यवहार में, डेवलपर्स C# प्रॉपर्टी इनिशियलाइज़ेशन की सामान्य गलतियाँ करते हैं, जो NullReferenceException या अप्रत्याशित व्यवहार का कारण बनती हैं।
इस लेख में हम टॉप-5 गलतियाँ और उनसे बचने के तरीके देखेंगे। आप C# 6 से C# 12 तक के आधुनिक तरीके सीखेंगे और समझेंगे कि आपके प्रोजेक्ट के लिए कौन सा तरीका सबसे अच्छा है।
\n\n\n\n
गलती #1: ऑटो-प्रॉपर्टी को इनिशियलाइज़ न करना
\n\nसबसे आम गलती है रेफरेंस टाइप्स के लिए शुरुआती मान न देना। कई शुरुआती डेवलपर ऐसा लिखते हैं:
\n\npublic class User\n{\n public string Name { get; set; } // डिफ़ॉल्ट null\n public List<string> Roles { get; set; } // null\n}\n\nC# में, रेफरेंस टाइप्स के लिए ऑटो-प्रॉपर्टी डिफ़ॉल्ट रूप से null होती हैं। इससे NullReferenceException की समस्या होती है जब आप उपयोग करने से पहले मान असाइन करना भूल जाते हैं।
समाधान क्या है?
\nहमेशा स्पष्ट रूप से C# ऑटो-प्रॉपर्टी इनिशियलाइज़र दें। सबसे आसान तरीका C# 6 का सिंटैक्स है:
\n\npublic class User\n{\n public string Name { get; set; } = string.Empty;\n public List<string> Roles { get; set; } = new List<string>();\n}\n\n\n\n\nसुझाव: खाली कोट्स के बजाय
\nstring.Emptyका उपयोग करें — इससे कोड अधिक पठनीय होता है और C# की बेस्ट प्रैक्टिसेज़ का पालन होता है।
\n\n
गलती #2: कंस्ट्रक्टर में इनिशियलाइज़ेशन, कॉल चेन को नज़रअंदाज़ करना
\n\nएक और आम गलती है C# में डिफ़ॉल्ट मान केवल कंस्ट्रक्टर में सेट करना, और प्रॉपर्टी इनिशियलाइज़र को अनदेखा करना। यह विरासत (inheritance) में भ्रम पैदा कर सकता है।
\n\npublic class BaseClass\n{\n public int Value { get; set; }\n\n public BaseClass()\n {\n Value = 10;\n }\n}\n\npublic class DerivedClass : BaseClass\n{\n public DerivedClass()\n {\n // Value पहले से = 10 है, लेकिन हम इसे ओवरराइट कर सकते हैं\n }\n}\n\nसमस्या: यदि आप Value प्रॉपर्टी में इनिशियलाइज़र भी जोड़ते हैं और कंस्ट्रक्टर में असाइनमेंट भी रखते हैं, तो निष्पादन का क्रम आपको हैरान कर सकता है। इनिशियलाइज़र बेस क्लास के कंस्ट्रक्टर बॉडी से पहले चलते हैं, लेकिन डिराइव्ड क्लास के कंस्ट्रक्टर कॉल के बाद।
कैसे बचें?
\nएक ही तरीका चुनें: या तो इनिशियलाइज़र या कंस्ट्रक्टर। C# ऑटो-प्रॉपर्टी इनिशियलाइज़र को प्राथमिकता दें, क्योंकि वे अधिक पूर्वानुमानित और संक्षिप्त होते हैं।
\n\npublic class BaseClass\n{\n public int Value { get; set; } = 10; // सत्य का एकमात्र स्रोत\n}\n\n\n\n
गलती #3: ऑटो-प्रॉपर्टी के बजाय readonly फील्ड का उपयोग
\n\nकुछ डेवलपर, शुरुआती मान सेट करने के लिए, ऑटो-प्रॉपर्टी छोड़कर पब्लिक फील्ड का उपयोग करते हैं:
\n\npublic class Config\n{\n public readonly int MaxRetries = 3; // गलती: एनकैप्सुलेशन का उल्लंघन\n}\n\nयह एक बुरी प्रैक्टिस है। फील्ड एनकैप्सुलेशन का उल्लंघन करते हैं — आप बिना API बदले getter/setter में लॉजिक नहीं जोड़ सकते। इसके अलावा, सीरियलाइज़ेशन या WPF/Blazor में उपयोग करने पर यह समस्याएँ पैदा करेगा।
\n\nसही तरीका
\nइनिशियलाइज़ेशन के साथ ऑटो-प्रॉपर्टी या C# 9 के init-only प्रॉपर्टी का उपयोग करें: