बहु # स्ट्रिंग शाब्दिक C # में


1046

क्या C # में मल्टीलाइन स्ट्रिंग शाब्दिक बनाने का एक आसान तरीका है?

यहाँ अब मेरे पास क्या है:

string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";

मुझे पता है PHP है

<<<BLOCK

BLOCK;

क्या C # में भी कुछ ऐसा ही है?


1
आपके उदाहरण में कोई पंक्ति विराम नहीं हैं। क्या तुम्हे वो चाहिये?
वीकेयर जुले

8
नहीं, मैं केवल दृश्यता / कोड स्वच्छता कारणों के लिए कई लाइनें चाहता था।
चेत

6
उस स्थिति में, वर्बेटिम स्ट्रिंग्स में लाइन ब्रेक होते हैं। यदि आप चाहें तो @ "..." का उपयोग कर सकते हैं। (पर्यावरण। पर्यावरण, "")।
२०

9
आपको 42एसक्यूएल इंजेक्शन से बचने के लिए, विशेष रूप से अगर यह उपयोगकर्ता इनपुट से आता है, तो आपको एक पैरामीटर के रूप में बाध्य करने पर विचार करना चाहिए ।
जेन्स मुलेनहॉफ़

@ JensMühlenhoff कोई व्यक्ति हार्ड-कोडेड स्ट्रिंग को कैसे इंजेक्ट करेगा, इसे कोड में परिभाषित किया गया है?
मिस्टर बॉय

जवाबों:


1587

आप वर्बेटिम स्ट्रिंग शाब्दिक बनाने के लिए @प्रतीक के सामने का उपयोग कर सकते हैं :string

string query = @"SELECT foo, bar
FROM table
WHERE id = 42";

जॉन स्केट के उत्तर में दिखाए गए दोहरे उद्धरण चिह्नों को छोड़कर, इस पद्धति का उपयोग करने पर आपको विशेष पात्रों से बचना भी नहीं है


43
यह वैसे भी एक स्ट्रिंग शाब्दिक है - यह @ चिह्न के साथ एक शब्दशः स्ट्रिंग शाब्दिक है।
जॉन स्कीट

95
यदि आपके स्ट्रिंग ( ") डबल उद्धरण शामिल हैं, तो आप उन्हें इतना पसंद बच सकते हैं:" "(thats दो दोहरे-उद्धरण वर्ण)
Muad'Dib

8
क्या नई लाइनें बनाने के बिना इसके ऊपर करने का एक तरीका है? मेरे पास पाठ का एक बहुत लंबा टुकड़ा है जिसे मैं प्लस ("हाय" + "") का उपयोग किए बिना आईडीई में लिपटे हुए देखना चाहता हूं।
noelicus

2
@ बेनेलीकस - वास्तव में नहीं, लेकिन आप इससे ऊपर की तकनीक का उपयोग करके इसे हल कर सकते हैं:@"my string".Replace(Environment.NewLine, "")
जॉन रस


566

इसे C # में एक शब्दशः स्ट्रिंग स्ट्रिंग शाब्दिक कहा जाता है , और यह शाब्दिक से पहले @ डालने की बात है। यह न केवल कई लाइनों की अनुमति देता है, बल्कि यह बच निकलता है। तो उदाहरण के लिए आप कर सकते हैं:

string query = @"SELECT foo, bar
FROM table
WHERE name = 'a\b'";

हालांकि, स्ट्रिंग में लाइन ब्रेक (आपके स्रोत के पास जो भी लाइन ब्रेक है उनका उपयोग करके) शामिल हैं। एसक्यूएल के लिए, यह न केवल हानिरहित है, बल्कि शायद स्ट्रिंग को देखने के लिए कहीं भी पठनीयता में सुधार करता है - लेकिन अन्य जगहों पर इसकी आवश्यकता नहीं हो सकती है, जिस स्थिति में आपको या तो शुरू करने के लिए मल्टी-लाइन वर्बेटिम स्ट्रिंग शाब्दिक का उपयोग नहीं करना होगा, या उन्हें परिणामी स्ट्रिंग से हटा दें।

भागने का एकमात्र तरीका यह है कि यदि आप एक डबल उद्धरण चाहते हैं, तो आपको एक अतिरिक्त डबल उद्धरण चिह्न जोड़ना होगा:

string quote = @"Jon said, ""This will work,"" - and it did!";

2
यह उत्तर गलत है; यह उन नई कहानियों का परिचय देता है जो ओपी की इच्छा नहीं है।
TamaMcGlinn

@TamaMcGlinn: मैं इस बारे में जवाब में कुछ जोड़ूंगा - यह स्पष्ट नहीं था जब ओपी ने प्रश्न लिखा था।
जॉन स्कीट

105

स्ट्रिंग शाब्दिक का उपयोग करने में मुझे जो समस्या है, वह यह है कि यह आपके कोड को थोड़ा " अजीब " बना सकता है क्योंकि स्ट्रिंग में खुद को स्थान न मिल पाने के कारण, इसे पूरी तरह से संरेखित करना होगा:

    var someString = @"The
quick
brown
fox...";

छी।

इसलिए मुझे जो समाधान उपयोग करना पसंद है, जो आपके बाकी कोड के साथ सब कुछ अच्छी तरह से रखता है:

var someString = String.Join(
    Environment.NewLine,
    "The",
    "quick",
    "brown",
    "fox...");

और हां, अगर आप सिर्फ SQL स्टेटमेंट की रेखाओं को तार्किक रूप से विभाजित करना चाहते हैं, जैसे आप हैं और वास्तव में नई लाइन की जरूरत नहीं है, तो आप हमेशा सिर्फ विकल्प Environment.NewLineके रूप में बदल सकते हैं " "


2
बहुत क्लीनर, धन्यवाद। इसके अलावा, String.Concat समान रूप से काम करता है और इसके लिए विभाजक की आवश्यकता नहीं होती है।
सेठ

धन्यवाद। मैं SQL के लिए String.Join को परिसीमन के साथ पसंद करता हूं "" क्योंकि यह इंडेंटेशन / पर-मैचिंग के लिए अनुमति देता है और अग्रणी स्थान को जोड़ने से बचा जाता है।
TVSeries.com पर रोब 16

7
जबकि बदसूरत, पहले संस्करण को चलाने के लिए कोई कोड की आवश्यकता नहीं है । दूसरा विकल्प स्पष्ट रूप से अलग-अलग तारों को समतल करने के लिए एक रन-टाइम ओवरहेड है।
कोडिंग किया गया

@GoneCoding, क्या आप इसके बारे में निश्चित हैं? संकलक दूर का अनुकूलन कर सकता है।
विलियम जोकस

@WilliamJockusch: आम तौर पर गैर-ऑपरेटर फ़ंक्शन कॉल (जैसे जुड़ना) बरकरार रहती हैं, और अनुकूलित नहीं होती हैं। सबसे अच्छा संकलित कोड की जाँच करें, लेकिन मैं पैसा लगाऊँगा कि कॉल ऑप्टिमाइज़ नहीं है।
कोडिंग

104

देखने के लिए एक अन्य गोत्र स्ट्रिंग में शाब्दिक शाब्दिक का उपयोग होता है। उस स्थिति में आपको घुंघराले ब्रेसिज़ / कोष्ठक '{' और '}' से बचना होगा।

// this would give a format exception
string.Format(@"<script> function test(x) 
      { return x * {0} } </script>", aMagicValue)
// this contrived example would work
string.Format(@"<script> function test(x) 
      {{ return x * {0} }} </script>", aMagicValue)

14
और इससे क्या फर्क पड़ता है? "@" के साथ या बिना आपको "{{" को प्रिंट करने योग्य वर्ण के रूप में "{" प्राप्त करने के लिए डबल करना होगा, यह स्ट्रिंग सामग्री की बात है। स्ट्रिंग की नहीं।
ग्रीनोल्डमैन

12
यह उन लोगों के लिए एक उल्लेखनीय गोच है जो एक स्ट्रिंग में जावास्क्रिप्ट कोड डालना चाहते हैं, जो नियमित स्ट्रिंग की तुलना में शब्दशः स्ट्रिंग शाब्दिक में अधिक बार किया जा सकता है।
एड ब्रानिन

2
नए C # 6.0 में, आप
वर्बेटिम

2
@ मुझे लगता है कि आपका मतलब है कि प्रक्षेपित तार भी उस वाक्य रचना के साथ शाब्दिक हो सकते हैं। var क्वेरी = $ @ "foo चुनें, टेबल से बार जहाँ id = {id}";
15

102

एक साइड-नोट के रूप में, C # 6.0 के साथ अब आप वर्बटिम स्ट्रिंग शाब्दिक के साथ प्रक्षेपित तार को जोड़ सकते हैं:

string camlCondition = $@"
<Where>
    <Contains>
        <FieldRef Name='Resource'/>
        <Value Type='Text'>{(string)parameter}</Value>
    </Contains>
</Where>";

10
कूल, मुझे इस बारे में अब तक पता नहीं था। अगर किसी को दिलचस्पी है: $ चीज़ को "इंटरपोलेटेड स्ट्रिंग्स" कहा जाता है और आप इसके बारे में यहां विस्तार से पढ़ सकते हैं: msdn.microsoft.com/en-us/library/dn961160.aspx
P.

tx, निश्चित शब्द
Heliac

1
मुझे लगता है कि एक शाब्दिक घुंघराले ब्रेस को दोगुना किया जाना चाहिए, जैसे $@"{{example literal text { fooString }. }}" यह कुछ भ्रमित कर सकता है क्योंकि कोणीय, प्रतिक्रिया, और V..s विपरीत सम्मेलन का उपयोग करते हैं।
पैट्रिक सज्जापस्की

58

लोग स्ट्रिंग शाब्दिक के साथ भ्रामक तार क्यों रखते हैं? स्वीकृत उत्तर एक अलग प्रश्न का एक शानदार उत्तर है; इस एक को नहीं।

मुझे पता है कि यह एक पुराना विषय है, लेकिन मैं ओपी के रूप में संभवतः एक ही सवाल के साथ यहां आया था, और यह देखकर निराशा होती है कि लोग इसे कैसे गलत बताते हैं। या शायद मैं इसे गलत बता रहा हूं, मुझे नहीं पता।

मोटे तौर पर, एक स्ट्रिंग कंप्यूटर मेमोरी का एक क्षेत्र है जो एक कार्यक्रम के निष्पादन के दौरान, बाइट्स का एक क्रम होता है जिसे पाठ वर्णों में मैप किया जा सकता है। दूसरी ओर एक स्ट्रिंग शाब्दिक, स्रोत कोड का एक टुकड़ा है, जो अभी तक संकलित नहीं है, जो उस प्रोग्राम के निष्पादन के दौरान बाद में एक स्ट्रिंग को इनिशियलाइज़ करने के लिए उपयोग किए जाने वाले मूल्य का प्रतिनिधित्व करता है जिसमें यह दिखाई देता है।

C # में, कथन ...

 string query = "SELECT foo, bar"
 + " FROM table"
 + " WHERE id = 42";

... एक तीन-लाइन स्ट्रिंग लेकिन एक लाइनर का उत्पादन नहीं करता है ; तीन तार (प्रत्येक एक अलग शाब्दिक से आरंभिक) का संयोजन जिसमें से कोई भी नया-पंक्ति संशोधक नहीं है।

ओपी क्या पूछ रहा है-कम से कम मैं उन शब्दों के साथ क्या पूछ रहा हूं- यह नहीं है कि कैसे लागू किया जाए, संकलित स्ट्रिंग में, लाइन टूट जाती है जो स्रोत कोड में पाई गई नकल करते हैं, लेकिन स्पष्टता के लिए लंबे समय तक कैसे टूटते हैं संकलित स्ट्रिंग में विराम के बिना स्रोत कोड में पाठ की एकल पंक्ति । और एक विस्तारित निष्पादन समय की आवश्यकता के बिना, स्रोत कोड से आने वाले कई सबस्ट्रिंग्स में शामिल होने में खर्च किया। जावास्क्रिप्ट या C ++ में एक बहुस्तरीय स्ट्रिंग शाब्दिक के भीतर पीछे की ओर पीछे की ओर।

वर्बटिम स्ट्रिंग्स के उपयोग का सुझाव देते हुए StringBuilder, String.Joinस्ट्रिंग रिवर्सल के साथ एस या एस और नेस्टेड कार्यों को कभी भी नहीं, मुझे लगता है कि मुझे लगता है कि लोग वास्तव में प्रश्न को नहीं समझ रहे हैं। या शायद मुझे यह समझ में नहीं आता है।

जहाँ तक मुझे पता है, C # (पिछले एक दशक से कम से कम मेरे द्वारा उपयोग किए जा रहे पैलियोलिथिक संस्करण में) नहीं है, जिसमें मल्टीलिन स्ट्रिंग शाब्दिक उत्पादन करने की सुविधा है जिसे निष्पादन के बजाय संकलन के दौरान हल किया जा सकता है।

हो सकता है कि वर्तमान संस्करण इसका समर्थन करते हों, लेकिन मुझे लगा कि मैं उन अंतरों को साझा करूंगा जो मैं स्ट्रिंग और स्ट्रिंग शाब्दिक के बीच अनुभव करता हूं।

अपडेट करें:

(MeowCat2012 की टिप्पणी से) आप कर सकते हैं। ओपी द्वारा "+" दृष्टिकोण सबसे अच्छा है। कल्पना के अनुसार अनुकूलन की गारंटी है: http://stackoverflow.com/a/288802/9399618


1
कुछ भ्रम (स्वयं सहित) मूल प्रश्न को देख रहे होंगे कि यहाँ-डॉक प्रारूप (शेल, php, पर्ल, ...) में शामिल हैं। इसलिए यदि ओपी PHP के हेरेडोक से तुलना कर रहा है, तो नईलाइनों में एक मुद्दा नहीं होना चाहिए।
टंकटालस

बिल्कुल सही। जहाँ तक मुझे पता है, आपका उत्तर "नहीं, आप C # में ऐसा नहीं कर सकते" सही है।
TamaMcGlinn

मुझे बताया गया था कि जावा में, इस तरह के एक संघनित स्ट्रिंग संकलित बायटेकोड में एकल स्ट्रिंग शाब्दिक बन जाएगा। शायद डॉट नेट भी ऐसा करते हैं?
मेव कैट 2012

2
आप ऐसा कर सकते हैं। ओपी द्वारा "+" दृष्टिकोण सबसे अच्छा है। कल्पना के अनुसार अनुकूलन की गारंटी है: stackoverflow.com/a/288802/9399618 फिर भी आप इस प्रश्न को समझने में से एक हैं। क्या संभावित भ्रामक लेकिन स्वीकृत उत्तरों को हटाना या मोड़ना संभव होगा?
मेव कैट 2012

1
संकेत के लिए धन्यवाद, @ MeowCat2012। कुछ विघटित कोड को देखकर, ऐसा लगता है कि वास्तव में मामला है।
कार्वो लोको

12

मैंने इसे नहीं देखा है, इसलिए मैं इसे यहां पोस्ट करूंगा (यदि आप एक स्ट्रिंग पास करने में रुचि रखते हैं तो आप ऐसा भी कर सकते हैं।) विचार यह है कि आप स्ट्रिंग को कई लाइनों पर तोड़ सकते हैं और अपनी खुद की सामग्री भी जोड़ सकते हैं। आप चाहते हैं कि किसी भी तरह से) कई लाइनों पर। यहां "टेबलनेम" को स्ट्रिंग में पारित किया जा सकता है।

    private string createTableQuery = "";

    void createTable(string tableName)
    {

         createTableQuery = @"CREATE TABLE IF NOT EXISTS
                ["+ tableName  + @"] (
               [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
               [Key] NVARCHAR(2048)  NULL, 
               [Value] VARCHAR(2048)  NULL
                                )";
    }

10
बहुत खतरनाक मैं कहूँगा: किसी के लिए एक आसान बनाने के लिए एक sql- इंजेक्शन उस तरह से।
काई

4
यह तब तक ठीक है जब तक आपको पता है कि आपके क्वेरी स्ट्रिंग में आपके सभी चर (यदि कोई हो!) कोड स्थिरांक या किसी अन्य सुरक्षित स्रोत से आते हैं - उदाहरण के लिए, createTable("MyTable"); किसी भी मामले में, ओपी का सवाल यह था कि कोड में सीधे मल्टीलाइन स्ट्रिंग शाब्दिक कैसे प्रविष्ट करें। नहीं, कैसे डेटाबेस प्रश्नों का निर्माण करने के लिए प्रति। :)
dbeachy1

2
शायद एक स्ट्रिंग बिल्डर का उपयोग करना चाहिए, खासकर अगर प्लसस (+) की संख्या बहुत अधिक है।
१२:

8

आप @ और "" का उपयोग कर सकते हैं ।

        string sourse = @"{
        ""items"":[
        {
            ""itemId"":0,
            ""name"":""item0""
        },
        {
            ""itemId"":1,
            ""name"":""item1""
        }
        ]
    }";

2
आपको समझाना चाहिए कि प्रत्येक क्या करता है, जैसा कि @ शब्दशः स्ट्रिंग के लिए है और "" दोहरे उद्धरणों से बचने के लिए है।
AFract

4

हाँ, आप वास्तविक स्ट्रिंग में newlines शुरू किए बिना कई लाइनों पर एक स्ट्रिंग को विभाजित कर सकते हैं, लेकिन यह बहुत सुंदर है:

string s = $@"This string{
string.Empty} contains no newlines{
string.Empty} even though it is spread onto{
string.Empty} multiple lines.";

चाल कोड को लागू करना है जो खाली का मूल्यांकन करता है, और उस कोड में आउटपुट को प्रभावित किए बिना नए अंक हो सकते हैं। मैंने इस प्रश्न के उत्तर से इस दृष्टिकोण को अनुकूलित किया ।

स्पष्ट रूप से कुछ भ्रम है कि प्रश्न क्या है, लेकिन दो संकेत हैं कि हम यहां क्या चाहते हैं एक स्ट्रिंग शाब्दिक है जिसमें कोई भी नई वर्ण नहीं है, जिसकी परिभाषा में कई लाइनें हैं। (टिप्पणियों में वह ऐसा कहते हैं, और "यहां मेरे पास क्या है" कोड दिखाता है जो इसमें नई कहानियों के साथ एक स्ट्रिंग नहीं बनाता है)

यह इकाई परीक्षण मंशा दर्शाता है:

    [TestMethod]
    public void StringLiteralDoesNotContainSpaces()
    {
        string query = "hi"
                     + "there";
        Assert.AreEqual("hithere", query);
    }

क्वेरी की उपरोक्त परिभाषा को बदलें ताकि यह दो स्ट्रिंग शाब्दिकों के मिलन के बजाय एक स्ट्रिंग शाब्दिक हो, जिसे संकलक द्वारा एक में अनुकूलित किया जा सकता है या नहीं।

C ++ दृष्टिकोण बैकस्लैश के साथ प्रत्येक पंक्ति को समाप्त करने के लिए होगा, जिससे नईलाइन वर्ण बच जाए और आउटपुट में प्रकट न हो। दुर्भाग्य से, अभी भी समस्या है कि परिणाम के बाद अतिरिक्त व्हाट्सएप को जोड़ने के लिए पहली पंक्ति के बाद प्रत्येक पंक्ति को संरेखित किया जाना चाहिए।

केवल एक ही विकल्प है जो संकलक अनुकूलन पर निर्भर नहीं करता है जो कि नहीं हो सकता है, जो कि आपकी परिभाषा को एक पंक्ति में रखना है। यदि आप संकलक अनुकूलन पर भरोसा करना चाहते हैं, तो आपके पास पहले से ही बहुत अच्छा है; आपको स्ट्रिंग को बाएं-संरेखित करने की आवश्यकता नहीं है, आपको परिणाम में नई लिंक नहीं मिलती है, और यह केवल एक ऑपरेशन है, कोई फ़ंक्शन कॉल नहीं है, जिस पर अनुकूलन की उम्मीद है।


1
रचनात्मक। हालाँकि ऐसा लगता है कि (पुष्टि नहीं की गई) इसे प्रारूप स्ट्रिंग के रूप में माना जाएगा और इसे अनुकूलित किया जा सकता है या नहीं। दूसरी ओर ओपी द्वारा "+" दृष्टिकोण सबसे अच्छा है। कल्पना के अनुसार अनुकूलन की गारंटी है: stackoverflow.com/a/288802/9399618
म्याऊ बिल्ली 2012

4

कई लाइनें जोड़ें: @ का उपयोग करें

string query = @"SELECT foo, bar
FROM table
WHERE id = 42";

बीच में स्ट्रिंग मान जोड़ें: $ का उपयोग करें

string text ="beer";
string query = $"SELECT foo {text} bar ";

एकाधिक पंक्ति स्ट्रिंग मध्य में मान जोड़ें: $ @ का उपयोग करें

string text ="Customer";
string query = $@"SELECT foo, bar
FROM {text}Table
WHERE id = 42";

3

यदि आप रिक्त स्थान / नई लिंक नहीं चाहते हैं, तो स्ट्रिंग को काम करना प्रतीत होता है:

var myString = String.Format(
  "hello " + 
  "world" +
  " i am {0}" +
  " and I like {1}.",
  animalType,
  animalPreferenceType
);
// hello world i am a pony and I like other ponies.

आप चाहें तो यहां ऊपर चला सकते हैं।


2
इस दृष्टिकोण के साथ एक (अनजाने में प्रदर्शित) दोष यह है कि आपको उन जगहों को शामिल करने के लिए बहुत सावधान रहना होगा जहां आप उन्हें चाहते हैं। मैं एक अधिक सुसंगत दृष्टिकोण की सिफारिश करूँगा जो मैंने लिया था (जैसे; हमेशा लाइन की शुरुआत में)।
Rattray

string + string सिर्फ वही है जो OP के साथ शुरू हुआ था, हालाँकि।
TamaMcGlinn

1

मुझे पता है कि मुझे पार्टी में थोड़ी देर हो गई है लेकिन मैं इस धागे के भविष्य के पाठकों के लिए https://www.buildmystring.com/ की सिफारिश करना चाहता हूं । आप इस साइट का उपयोग करके किसी भी कोड को C # स्ट्रिंग शाब्दिक में बदल सकते हैं।


-10

आप इस दो तरीकों का उपयोग कर सकते हैं:

    private static String ReverseString(String str)
    {
        int word_length = 0;
        String result = "";
        for (int i = 0; i < str.Length; i++)
        {
            if (str[i] == ' ')
            {
                result = " " + result;
                word_length = 0;
            }
            else
            {
                result = result.Insert(word_length, str[i].ToString());
                word_length++;
            }
        }
        return result;
    }
//NASSIM LOUCHANI
    public static string SplitLineToMultiline(string input, int rowLength)
    {
        StringBuilder result = new StringBuilder();
        StringBuilder line = new StringBuilder();

        Stack<string> stack = new Stack<string>(ReverseString(input).Split(' '));

        while (stack.Count > 0)
        {
            var word = stack.Pop();
            if (word.Length > rowLength)
            {
                string head = word.Substring(0, rowLength);
                string tail = word.Substring(rowLength);

                word = head;
                stack.Push(tail);
            }

            if (line.Length + word.Length > rowLength)
            {
                result.AppendLine(line.ToString());
                line.Clear();
            }

            line.Append(word + " ");
        }

        result.Append(line);
        return result.ToString();
    }

SplitLineToMultiline () में, आपको उस स्ट्रिंग को परिभाषित करने की आवश्यकता है जिसे आप उपयोग करना चाहते हैं और पंक्ति की लंबाई, यह बहुत सरल है। धन्यवाद ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.