परिचय: जब कोड "मुड़ने" लगे
\n\nकल्पना करें: आप C# में कोड लिख रहे हैं और मान: {42} जैसा मैसेज आउटपुट करना है। आप String.Format("मान: {0}", 42) का उपयोग करते हैं और अपेक्षित परिणाम मिलता है। अब बिना किसी सब्स्टीट्यूशन के सिर्फ {42} आउटपुट करने की कोशिश करें। भोलेपन से यह लिखने पर:
string result = String.Format("{{42}}");\n\nआपको {42} दिखने की उम्मीद है, लेकिन इसके बजाय फॉर्मेट एरर या खाली स्ट्रिंग मिलती है। परिचित लग रहा है? यह सवाल Stack Overflow पर सबसे लोकप्रिय में से एक है, जिसे हज़ारों बार देखा गया है। और आज हम सिर्फ जवाब नहीं देंगे, बल्कि .NET के अंदर झांकेंगे ताकि समझ सकें कि C# में कर्ली ब्रेसेस का एस्केप कैसे काम करता है। चलिए शुरू करते हैं!
समस्या: {{ दूसरी भाषाओं की तरह क्यों काम नहीं करता?
\n\nC# में, फॉर्मेटिंग स्ट्रिंग्स में कर्ली ब्रेसेस {} विशेष कैरेक्टर हैं। ये बताते हैं कि वैल्यू सब्स्टीट्यूशन के लिए प्लेसहोल्डर कहाँ शुरू और खत्म होता है। उदाहरण के लिए, {0} का मतलब है "यहाँ पहला आर्गुमेंट डालें"।
लेकिन क्या होगा अगर हमें कर्ली ब्रेसेस को टेक्स्ट के रूप में ही आउटपुट करना हो? ज़्यादातर भाषाओं (Python, Java) में एस्केप डबल करके काम करता है: {{ से { मिलता है। C# में भी यही लॉजिक है, लेकिन एक पेच है: दो ओपनिंग ब्रेसेस {{ एक { में बदल जाते हैं, लेकिन केवल तब जब वे किसी सही प्लेसहोल्डर का हिस्सा न हों।
एक रियल लाइफ उदाहरण: आप C# में कोड जनरेटर लिख रहे हैं और if (x > 0) { return x; } स्ट्रिंग आउटपुट करनी है। अगर आप सीधे लिखते हैं:
string template = "if (x > 0) { return x; }";\n\nकंपाइलर या String.Format { return x; } को फॉर्मेटिंग की कोशिश समझेगा और FormatException फेंक देगा।
समाधान: C# में कर्ली ब्रेसेस का सही एस्केप
\n\nक्लासिक तरीका: String.Format और StringBuilder
\n\nनियम सरल है: एक कर्ली ब्रेस आउटपुट करने के लिए, लगातार दो लिखें।
\n\n// आउटपुट होगा: {Hello World}\nstring result = String.Format("{{Hello World}}");\nConsole.WriteLine(result); // {Hello World}\n\nलेकिन एक बारीकी है: अगर आपको एक साथ प्लेसहोल्डर और एस्केप की गई ब्रेसेस का उपयोग करना है, तो ऑर्डर महत्वपूर्ण है। पहले एस्केप, फिर सब्स्टीट्यूशन:
\n\nint value = 42;\n// आउटपुट होगा: कर्ली ब्रेसेस में मान {42}\nstring result = String.Format("कर्ली ब्रेसेस में मान {{{0}}}", value);\nConsole.WriteLine(result); // कर्ली ब्रेसेस में मान {42}\n\nइसे टुकड़ों में समझें: {{{0}}} का मतलब है {{ (एक ब्रेस) + {0} (प्लेसहोल्डर) + }} (एक ब्रेस)। नतीजा: {42}।
स्ट्रिंग इंटरपोलेशन ($"...") – आधुनिक तरीका
\n\nC# 6 से शुरू होकर, हमारे पास स्ट्रिंग इंटरपोलेशन है। यहाँ एस्केप अलग तरह से काम करता है – ब्रेसेस को डबल करके, लेकिन अंदर कोई प्लेसहोल्डर नहीं:
\n\nint value = 42;\n// आउटपुट होगा: कर्ली ब्रेसेस में मान {42}\nstring result = $"कर्ली ब्रेसेस में मान {{{value}}}";\nConsole.WriteLine(result); // कर्ली ब्रेसेस में मान {42}\n\nध्यान दें: इंटरपोलेशन में {{ से { मिलता है, और {value} सब्स्टीट्यूशन है। नियम याद रखें: दो ब्रेसेस – एक ब्रेस।
एडवांस केस: StringBuilder.AppendFormat
\n\nजब StringBuilder के साथ काम करें, तो वही सिंटैक्स उपयोग करें:
var sb = new StringBuilder();\nsb.AppendFormat("{{0}} = {0}", 123);\nConsole.WriteLine(sb.ToString()); // {0} = 123\n\nयह अंदर कैसे काम करता है: फॉर्मेटिंग मैकेनिज्म की व्याख्या
\n\nचलिए .NET के सोर्स कोड में झांकते हैं (यह GitHub पर ओपन है!)। जब आप String.Format कॉल करते हैं, तो अंदर FormatHelper मेथड चलता है, जो फॉर्मेट स्ट्रिंग के कैरेक्टर्स पर इटरेट करता है।