C# में दो प्रश्न चिह्न: कोई गलती नहीं, बल्कि एक शक्तिशाली उपकरण
\n\nकल्पना करें: आप C# में कोड लिख रहे हैं, और अचानक ?? दिखता है। पहला विचार — टाइपिंग की गलती? एक अतिरिक्त चिह्न? असल में, यह भाषा के सबसे सुंदर और उपयोगी ऑपरेटरों में से एक है — null-कोलेसिंग ऑपरेटर (null-coalescing operator)। यदि आपने कभी NullReferenceException पकड़ा है और सब कुछ कोसा है — यह ऑपरेटर आपकी जीवन रेखा बन जाएगा।
इस लेख में हम जानेंगे कि C# में दो प्रश्न चिह्न का क्या अर्थ है, उनका सही उपयोग कैसे करें, वे टर्नरी ऑपरेटर से कैसे भिन्न हैं, और व्यावहारिक उदाहरण देखेंगे। चलिए शुरू करते हैं!
\n\nC# में ?? ऑपरेटर क्या है?
\n\n?? ऑपरेटर (दो प्रश्न चिह्न) एक बाइनरी ऑपरेटर है जो बाएं ऑपरेंड को लौटाता है यदि वह null नहीं है; अन्यथा दायां ऑपरेंड लौटाता है। सीधे शब्दों में: "यदि बाईं ओर null नहीं है — बाईं ओर लो, अन्यथा दाईं ओर लो"।
सिंटैक्स बेहद सरल है:
\n\nvar result = left ?? right;\n\nजहां:
\n- \n
left— वह मान जो null हो सकता है; \n right— डिफ़ॉल्ट मान (यदि दायां प्रकार nullable है तो null नहीं हो सकता)। \n
पहला उदाहरण: null से बचाव
\n\nमान लीजिए आपके पास string? name (nullable string) वेरिएबल है। आप उपयोगकर्ता का नाम दिखाना चाहते हैं, और यदि नाम नहीं है तो "अतिथि" दिखाना चाहते हैं:
string? name = GetUserName(); // null भी लौटा सकता है\nstring displayName = name ?? "अतिथि";\nConsole.WriteLine(displayName);\n\n?? ऑपरेटर के बिना आपको यह लिखना पड़ता:
string displayName = (name != null) ? name : "अतिथि";\n\nमानेंगे, पहला विकल्प एक सामान्य वाक्य की तरह पढ़ा जाता है: "नाम या अतिथि"। सुंदर है, है ना?
\n\n??= ऑपरेटर: null-कोलेसिंग का नया रूप
\n\nC# 8.0 से शुरू होकर, ??= ऑपरेटर आया — यह null-कोलेसिंग के साथ असाइनमेंट का संक्षिप्त रूप है। यह दाएं ऑपरेंड के मान को बाएं ऑपरेंड को असाइन करता है, केवल तभी जब बायां ऑपरेंड null हो।
सिंटैक्स:
\n\nleft ??= right;\n\nयह इसके बराबर है:
\n\nif (left == null) left = right;\n\n??= के साथ उदाहरण
\n\nList<int>? numbers = null;\nnumbers ??= new List<int>(); // numbers अब = new List<int>()\nnumbers.Add(42);\nConsole.WriteLine(numbers.Count); // 1\n\nध्यान दें: यदि numbers पहले से इनिशियलाइज़्ड होता (null नहीं), तो असाइनमेंट नहीं होता। यह लेज़ी इनिशियलाइज़ेशन के लिए एकदम सही है।
टर्नरी ऑपरेटर (? :) से तुलना
\n\nकई शुरुआती ?? को टर्नरी ऑपरेटर ? : से भ्रमित करते हैं। आइए एक बार और हमेशा के लिए समझ लें:
- \n
- टर्नरी ऑपरेटर — if-else का संक्षिप्त रूप है। यह किसी भी बूलियन शर्त की जाँच करता है:
शर्त ? मान_यदि_सही : मान_यदि_गलत। \n - ?? ऑपरेटर — केवल null की जाँच करता है। यह एक विशिष्ट मामला है, जो एक विशेष कार्य के लिए बनाया गया है। \n
टर्नरी ऑपरेटर का उदाहरण:
\n\nint age = 18;\nstring status = (age >= 18) ? "वयस्क" : "नाबालिग";\n\nअब देखें कि यदि ?? को टर्नरी से बदलने की कोशिश करें तो क्या होगा:
string? name = null;\nstring displayName = name != null ? name : "अतिथि"; // काम करता है, लेकिन लंबा है\nstring displayName2 = name ?? "अतिथि"; // छोटा और स्पष्ट\n\nनिष्कर्ष: जब आपको null के बजाय डिफ़ॉल्ट मान डालना हो, तो ?? का उपयोग करें। बाकी सभी शर्तों के लिए टर्नरी ऑपरेटर का उपयोग करें।
?? ऑपरेटरों की श्रृंखला
\n\nआप कई ?? ऑपरेटरों को एक श्रृंखला में जोड़ सकते हैं। यह तब उपयोगी होता है जब मान के कई संभावित स्रोत हों:
string? firstChoice = GetFromCache