एक नियमित स्ट्रिंग और एक क्रिया स्ट्रिंग के बीच अंतर क्या है?


166

मेरे पास Resharper का एक परीक्षण संस्करण है और यह हमेशा सुझाव देता है कि मैं नियमित स्ट्रिंग्स को शब्दशः स्ट्रिंग्स पर स्विच करता हूं। अंतर क्या है?


3
मैंने ReSharper के इस सुझाव को कभी नहीं देखा है। क्या आप एक उदाहरण दे सकते हैं जहां यह सुझाव देता है?
जॉन साउन्डर्स

3
मुझे अभी पता चला। पहला सुझाव इसे एक संसाधन में ले जाने का था, लेकिन दूसरा इसे शब्दशः स्ट्रिंग बनाने के लिए था: MessageBox.Show ("काम आगे बढ़ने से पहले एक प्लैटिपस को पालतू बनाना चाहिए");
बी क्ले शैनन

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

यदि आप विजुअल स्टूडियो आईडीई के लिए मेरी सुझाई गई सुविधा को पसंद करते हैं, तो कृपया यहां देखें: developercommunity.visualstudio.com/idea/602807/…
Olivier Jacot-Descombes

जवाबों:


191

एक शब्दशः स्ट्रिंग वह है जिसे फ़ाइल नाम की तरह भाग निकलने की आवश्यकता नहीं है:

string myFileName = "C:\\myfolder\\myfile.txt";

होने वाला

string myFileName = @"C:\myfolder\myfile.txt";

@ प्रतीक का अर्थ है उस स्ट्रिंग को शाब्दिक रूप से पढ़ना, और अन्यथा नियंत्रण वर्णों की व्याख्या न करना।


12
मुझे आश्चर्य है कि क्यों Resharper इस परिवर्तन का सुझाव देता है। क्या किसी सीएलआर गुरु को पता है कि क्या वर्बटीम स्ट्रिंग्स को अधिक कुशलता से संसाधित किया जाता है क्योंकि भागने के पात्रों को अनदेखा किया जा सकता है?
मैट पीटरसन

9
मुझे लगता है कि हो सकता है कि ReSharper इसका सुझाव दे क्योंकि क्रिया स्ट्रिंग अधिक पठनीय है।
जिप

36
मेरा मानना ​​है कि यह एक तरह का कोडिंग कन्वेंशन है (मैंने पहले कभी नहीं देखा या सुना है)। स्ट्रिंग्स के लिए ReSharper या तो स्थानीयकरण के लिए एक संसाधन फ़ाइल में ले जाने या इसे शब्दशः बनाने का सुझाव देता है - शब्दशः स्ट्रिंग्स के लिए ReSharper फिर स्ट्रिंग को स्थानीय करने का विकल्प प्रदान नहीं करता है। तो ऐसा लगता है कि सभी तरह के तार बनाने के लिए एक सम्मेलन की जरूरत है, जिसमें स्थानीयकरण की जरूरत नहीं है।
डैनियल ब्रुकनर

मान लें कि हमारे पास स्ट्रिंग वेरिएबल को स्ट्रिंग वेरिएबल को सौंपा गया है, स्ट्रिंग myFileName = "C: \\ myfolder \\ myfile.txt"; अब, मैं myFileName स्ट्रिंग चर को शब्दशः स्ट्रिंग में बदलना चाहता हूं। मैं यह कैसे करुं? क्या यह काम करता है? string verbatimStr = @myFileName;
संजीव भूसाल

3
@ संजीविभूषण: आप वास्तव में ऐसा कभी नहीं करते हैं। @ "C: \ myfolder \ myfile.txt" और "C: \\ myfolder \\ myfile.txt" सीएलआर के लिए एक ही बात है। यह सिर्फ वाक्यात्मक चीनी है, मूल रूप से।
alc6379

68

यह C # विनिर्देश के भाग 2.4.4.5 में शामिल है :

२.४.४.५ शृंगार शास्त्रा

C # स्ट्रिंग शाब्दिक के दो रूपों का समर्थन करता है: नियमित रूप से स्ट्रिंग शाब्दिक और शब्दशः स्ट्रिंग शाब्दिक।

"हेलो" के रूप में एक नियमित स्ट्रिंग शाब्दिक में दोहरे उद्धरणों में संलग्न शून्य या अधिक वर्ण होते हैं, और इसमें दोनों सरल एस्केप सीक्वेंस (जैसे कि टैब कैरेक्टर के लिए \ t) और हेक्साडेसिमल और यूनिकोड एस्केप सीक्वेंस शामिल हो सकते हैं।

एक शब्दशः स्ट्रिंग शाब्दिक में एक @ वर्ण होता है, जिसके बाद एक दोहरे उद्धरण वर्ण, शून्य या अधिक वर्ण होते हैं, और एक बंद दोहरे वर्ण होता है। एक सरल उदाहरण @ "हैलो" है। एक शब्दशः स्ट्रिंग शाब्दिक में, सीमांकक के बीच के वर्णों की व्याख्या शब्दशः की जाती है, एकमात्र अपवाद एक उद्धरण-एस्केप-अनुक्रम है। विशेष रूप से, सरल एस्केप सीक्वेंस और हेक्साडेसिमल और यूनिकोड एस्केप सीक्वेंस को वर्बटीम स्ट्रिंग लिटरल में संसाधित नहीं किया जाता है। एक वर्बटीम स्ट्रिंग शाब्दिक कई लाइनों को फैला सकता है।

दूसरे शब्दों में एक @ "शब्दशः स्ट्रिंग शाब्दिक" में एकमात्र विशेष चरित्र दोहरे-भाव वाला चरित्र है। यदि आप एक वर्बटिम स्ट्रिंग लिखने की इच्छा रखते हैं जिसमें एक डबल-कोट है तो आपको दो डबल-कोट्स लिखना होगा। अन्य सभी पात्रों की शाब्दिक व्याख्या की जाती है।

तुम भी एक शब्दशः स्ट्रिंग शाब्दिक में शाब्दिक नई लाइनें हो सकती है। एक नियमित स्ट्रिंग शाब्दिक में आपके पास शाब्दिक नई लाइनें नहीं हो सकती हैं। इसके बजाय आपको उदाहरण के लिए उपयोग करना चाहिए "\n"

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

नियमित स्ट्रिंग शाब्दिक से बनाए गए तार और एक क्रियात्मक शाब्दिक शब्द से निर्मित तार के बीच कोई अंतर नहीं है - वे दोनों प्रकार के हैं System.String


27

एक स्ट्रिंग और वर्बेटिम स्ट्रिंग के बीच कोई रनटाइम अंतर नहीं है। वे केवल संकलन समय पर अलग हैं। कंपाइलर एक शब्दशः स्ट्रिंग में कम भागने के क्रम को स्वीकार करता है, तो आप क्या-क्या-क्या-क्या-आप-एक बोली भागने के अलावा अन्य प्राप्त करते हैं।

आप एक नाम के रूप में एक कीवर्ड का इलाज करने के लिए संकलक को बताने के लिए, वर्बेटिम वर्ण, @ का उपयोग कर सकते हैं:

var @if = "if";
//okay, treated as a name
Console.WriteLine(@if);
//compiler err, if without @ is a keyword
Console.WriteLine(if);

var @a = "a";
//okay
Console.WriteLine(@a);
//also okay, @ isn't part of the name
Console.WriteLine(a);

16

वर्बेटिम स्ट्रिंग्स का उपयोग करके आप मल्टीलाइन स्ट्रिंग भी कर सकते हैं:

Console.WriteLine(@"This
    is
    a
    Test
    for stackoverflow");

आपके बिना @एक त्रुटि हुई।

VB14 में एक नया फीचर है Multiline Strings, यह C # में वर्बेटिम स्ट्रिंग्स की तरह है।

मल्टीलाइन स्ट्रिंग्स

प्रो टिप: वीबी स्ट्रिंग शाब्दिक अब सी # वर्बटीम स्ट्रिंग्स की तरह हैं।


13

नियमित तार विशेष वर्णों में अनुवाद करने के लिए विशेष एस्केप दृश्यों का उपयोग करते हैं।

/*
This string contains a newline
and a tab    and an escaped backslash\
*/
Console.WriteLine("This string contains a newline\nand a tab\tand an escaped backslash\\");

Verbatim स्ट्रिंग्स की व्याख्या किसी भी एस्केप सीक्वेंस के अनुवाद के बिना की जाती है:

/* 
This string displays as is. No newlines\n, tabs\t or backslash-escapes\\.
*/
Console.WriteLine(@"This string displays as is. No newlines\n, tabs\t or backslash-escapes\\.");

0

यदि आप रिचार्ज चेतावनी को हटाना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

Localizable(false)

मापदंडों, फ़ाइल स्थानों, जैसे चीजों के लिए। यह एक अच्छा समाधान हो सकता है।

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