एक बार Stack Overflow पर: C# में लंबी स्ट्रिंग्स का अभिशाप
\n\nएक स्थिति की कल्पना करें। आप C# में कोड के अंदर ही एक कॉन्फ़िगरेशन JSON, SQL क्वेरी, या मान लीजिए, एक HTML टेम्पलेट लिख रहे हैं। स्ट्रिंग लंबी, बदसूरत और पूरी तरह से अपठनीय हो जाती है। आप टेक्स्ट को अगली पंक्ति में ले जाने के लिए Enter दबाते हैं... और आपको कंपाइलेशन एरर मिलती है। परिचित लगता है?
\n\nStack Overflow पर प्रश्न "C# में मल्टीलाइन स्ट्रिंग लिटरल" ने हजारों बार देखा गया है। और यह कोई संयोग नहीं है। लंबे समय तक, C# मल्टीलाइन टेक्स्ट के साथ काम करने के लिए सबसे अनुकूल भाषा नहीं थी। लेकिन समय बदल रहा है। इस लेख में, हम C# 11 में आए सुरुचिपूर्ण समाधानों तक का सफर तय करेंगे।
\n\nयदि आप C# में लिखते हैं और मल्टीलाइन स्ट्रिंग लिटरल के साथ काम करते हैं, तो यह सामग्री आपके घंटों की गूगलिंग बचाएगी। चलिए शुरू करते हैं!
\n\nसमस्या: केवल Enter दबाना एक बुरा विचार क्यों है?
\n\nC# (C++ की तरह) में, एक स्ट्रिंग लिटरल कोट्स में बंद वर्णों का एक क्रम है। ऐसे कोट्स के अंदर लाइन ब्रेक एक सिंटैक्स एरर है। कंपाइलर यह नहीं समझ पाएगा कि स्ट्रिंग कहाँ समाप्त होती है।
\n\nयहाँ बताया गया है कि कैसे नहीं करना चाहिए:
\n\n// कंपाइलेशन एरर!\nstring query = "SELECT * FROM Users\nWHERE Age > 18\nORDER BY Name";\n\nकंपाइलर "SELECT * FROM Users देखेगा — और बस। आगे अंधकार है। पहले, डेवलपर्स जैसे भी संभव होता था, वैसे ही काम चलाते थे। आइए समाधानों के विकास को समझते हैं।
पुराना तरीका: Verbatim string (@-स्ट्रिंग) — जीवन रक्षक
\n\nसबसे पहला विचार जो दिमाग में आता है वह है verbatim string literal। आप बस शुरुआती कोट से पहले @ लगा देते हैं। यह एस्केप सीक्वेंस की व्याख्या को बंद कर देता है (डबल कोट्स "" को छोड़कर)।
लेकिन एक बारीकी है: इंडेंटेशन भी स्ट्रिंग का हिस्सा बन जाता है।
\n\nVerbatim string के साथ उदाहरण:
\n\nstring json = @"{\n ""name"": ""Alice"",\n ""age"": 30\n}";\nConsole.WriteLine(json);\n\nआउटपुट:
\n{\n "name": "Alice",\n "age": 30\n}\n\nलाभ:
\n- \n
- C# के सभी संस्करणों में काम करता है। \n
- बैकस्लैश (
\\) को एस्केप करने की आवश्यकता नहीं है। \n
नुकसान:
\n- \n
- अंदर के कोट्स को दोगुना करना पड़ता है (
"") — यदि बहुत सारा JSON है तो यह भयानक है। \n - बाईं ओर के इंडेंट (स्पेस/टैब) अंतिम स्ट्रिंग में शामिल हो जाते हैं। \n
- सीधे स्ट्रिंग इंटरपोलेशन (
$) के साथ मिश्रित नहीं किया जा सकता (लेकिन$@संभव है)। \n
यह विधि अभी भी लोकप्रिय है, लेकिन स्वच्छ कोड के लिए यह आदर्श नहीं है। असली सफलता C# 11 में हुई।
\n\nनवीनतम तरीका: Raw string literal (C# 11 और .NET 7+)
\n\nC# 11 से शुरू करते हुए, हमारे पास raw string literal है — शाब्दिक रूप से "कच्चा स्ट्रिंग लिटरल"। यह मल्टीलाइन की 99% समस्याओं को हल करता है।
\n\nसिंटैक्स: लगातार तीन या अधिक डबल कोट्स (""")।
उदाहरण 1: बिना एस्केपिंग के सरल JSON
\n\nstring json = """\n {\n "name": "Alice",\n "age": 30\n }\n """;\nConsole.WriteLine(json);\n\nआउटपुट:
\n{\n "name": "Alice",\n "age": 30\n}\n\nजादू: स्ट्रिंग के अंदर कोट्स को दोगुना करने की आवश्यकता नहीं है! कंपाइलर समझता है कि स्ट्रिंग तभी समाप्त हुई है जब वह लगातार तीन कोट्स देखता है।
\n\nउदाहरण 2: इंडेंट के साथ SQL क्वेरी
\n\nstring query = """\n SELECT \n u.Name,\n o.OrderDate\n FROM Users u\n JOIN Orders o ON u.Id = o.UserId\n WHERE o.Status = 'Active'\n ORDER BY o.OrderDate DESC\n """;\nConsole.WriteLine(query);\n\nइंडेंट के बारे में महत्वपूर्ण: समापन कोट्स (""") इंडेंट का आधार स्तर निर्धारित करते हैं। वे सभी पंक्तियाँ जिनमें समापन कोट्स से कम इंडेंट है, काट दी जाएंगी। यह कोड की पठनीयता बनाए रखने की अनुमति देता है, बिना स्ट्रिंग को अनावश्यक स्पेस से अव्यवस्थित किए।