C# में घुंघराले कोष्ठक सिरदर्द क्यों हैं?
\n\nक्या आपने कभी C# में कोड लिखा है, {नाम}: {मान} जैसा टेक्स्ट आउटपुट करना चाहा है, और इसके बजाय FormatException मिला है? यदि हाँ — तो आप अकेले नहीं हैं। Stack Overflow पर प्रश्न «How to escape curly brace in String.Format» ने दसियों हज़ार बार देखा गया है। और यह कोई संयोग नहीं है: C# में घुंघराले कोष्ठक {} का विशेष अर्थ है — वे वेरिएबल्स के प्रतिस्थापन के लिए स्थान दर्शाते हैं।
लेकिन क्या करें यदि आपको कोष्ठकों को सामान्य वर्णों के रूप में आउटपुट करने की आवश्यकता है? उदाहरण के लिए, JSON, टेम्पलेट्स, कोड जनरेशन, या बस एक सुंदर रिपोर्ट फ़ॉर्मेटिंग के लिए? आज हम इस विषय को शुरू से अंत तक समझेंगे: सरल एस्केपिंग से लेकर StringBuilder और स्ट्रिंग इंटरपोलेशन के साथ उन्नत ट्रिक्स तक।
घुंघराले कोष्ठकों को कैसे एस्केप करें: मूल नियम
\n\nउत्तर सरल और सुरुचिपूर्ण है: कोष्ठक को दोगुना करें। यदि आप एक खुला कोष्ठक { आउटपुट करना चाहते हैं, तो {{ लिखें। बंद कोष्ठक } के लिए — }} लिखें। C# समझ जाएगा कि यह प्लेसहोल्डर नहीं, बल्कि एक सामान्य वर्ण है।
यहाँ सबसे सरल उदाहरण है:
\n\nstring result = string.Format("घुंघराले कोष्ठकों में मान: {{0}}", 42);\nConsole.WriteLine(result);\n// आउटपुट: घुंघराले कोष्ठकों में मान: {0}\n\nध्यान दें: {{0}} — यह प्लेसहोल्डर नहीं है, बल्कि कोष्ठकों की एक एस्केप की गई जोड़ी है, जिसके अंदर अंक 0 है। यदि हम {0} लिखते, तो हमें वेरिएबल का मान (संख्या 42) मिलता।
शुरुआती की सामान्य गलती
\n\nअक्सर शुरुआती ऐसे लिखते हैं:
\n\n// गलती!\nstring bad = string.Format("नमस्ते, {name}!", name);\n// FormatException: Input string was not in a correct format.\n\nक्यों? क्योंकि C# कोष्ठकों के अंदर एक संख्यात्मक इंडेक्स की अपेक्षा करता है ({0}, {1}), न कि वेरिएबल का नाम। नामों के लिए स्ट्रिंग इंटरपोलेशन (नीचे देखें) या स्पष्ट रूप से इंडेक्स निर्दिष्ट करने का उपयोग करें।
व्यावहारिक उदाहरण: सरल से जटिल तक
\n\nआइए कुछ वास्तविक परिदृश्यों को समझें जहाँ कोष्ठकों को एस्केप करना आवश्यक है।
\n\n1. डीबगिंग उद्देश्यों के लिए JSON या XML आउटपुट
\n\nमान लीजिए, आप एक लॉगर लिख रहे हैं और मान प्रतिस्थापन के साथ JSON स्ट्रिंग आउटपुट करना चाहते हैं:
\n\nint userId = 101;\nstring json = string.Format("{{\\"userId\\": {0}, \\"name\\": \\"Alice\\"}}", userId);\nConsole.WriteLine(json);\n// आउटपुट: {"userId": 101, "name": "Alice"}\n\nयहाँ {{ और }} JSON के बाहरी घुंघराले कोष्ठक बनाते हैं, और {0} संख्या प्रतिस्थापित करता है।
2. कोड टेम्पलेट्स का जनरेशन
\n\nमान लीजिए, आप C# में कोड जनरेटर लिख रहे हैं। किसी अन्य भाषा (जैसे Python या JavaScript) के लिए टेम्पलेट के साथ एक स्ट्रिंग बनाने की आवश्यकता है:
\n\nstring template = string.Format("def {0}():\\n return {{0}}", "calculate");\nConsole.WriteLine(template);\n// आउटपुट:\n// def calculate():\n// return {0}\n\nध्यान दें: आउटपुट स्ट्रिंग में {{0}} अब C# का प्लेसहोल्डर नहीं है, बल्कि जनरेट किए गए कोड का हिस्सा है (उदाहरण के लिए, Python के लिए)।
3. एकाधिक प्लेसहोल्डर्स और कोष्ठकों के साथ फ़ॉर्मेटिंग
\n\nजब प्रतिस्थापन और एस्केपिंग को मिलाना हो, तो मुख्य बात इंडेक्स में भ्रमित न होना है:
\n\nstring name = "Bob";\nint age = 30;\nstring message = string.Format("उपयोगकर्ता {{ {0} }} (आयु: {1})", name, age);\nConsole.WriteLine(message);\n// आउटपुट: उपयोगकर्ता { Bob } (आयु: 30)\n\nयहाँ {{ देता है {, }} देता है }, और {0} और {1} मान प्रतिस्थापित करते हैं।
String.Format के विकल्प: स्ट्रिंग इंटरपोलेशन और StringBuilder
\n\nहालाँकि string.Format क्लासिक है, आधुनिक C# में अधिक सुविधाजनक तरीके हैं। आइए तुलना करें।
स्ट्रिंग इंटरपोलेशन (C# 6+)
\n\nइंटरपोलेशन स्ट्रिंग से पहले $ का जादू है। यह पढ़ने में बेहतर है, लेकिन कोष्ठकों का एस्केपिंग बना रहता है