C # में स्ट्रिंग के सामने @ क्या है?


602

यह C # (या संभवतः VB.net) के लिए एक .NET प्रश्न है, लेकिन मैं यह जानने की कोशिश कर रहा हूं कि निम्नलिखित घोषणाओं में क्या अंतर है:

string hello = "hello";

बनाम

string hello_alias = @"hello";

कंसोल पर प्रिंट करने से कोई फर्क नहीं पड़ता, लंबाई के गुण समान होते हैं।


कृपया देखें (और upvote) दृश्य स्टूडियो आईडीई के लिए बेहतर वर्बेटिम स्ट्रिंग प्रारूपण के लिए मेरा सुझाव: इंडेंट मल्टी-लाइन वर्बेटिम स्ट्रिंग्स
ओलिवियर जैकोट-डेसकॉम्बस

स्पष्ट होने के लिए, ऊपर दिए गए उदाहरण ठीक उसी परिणाम का उत्पादन कर रहे हैं जिसके साथ या उसके बिना @
मिरो जे।

जवाबों:


767

यह स्ट्रिंग को एक वर्बटीम स्ट्रिंग शाब्दिक के रूप में चिह्नित करता है - स्ट्रिंग में कुछ भी जो आमतौर पर एक व्याख्या अनुक्रम के रूप में व्याख्या की जाती है उसे अनदेखा किया जाता है।

तो "C:\\Users\\Rich"जैसा है वैसा ही है@"C:\Users\Rich"

एक अपवाद है: दोहरे उद्धरण के लिए एक एस्केप अनुक्रम आवश्यक है। दोहरे उद्धरण-चिह्न से बचने के लिए, आपको एक पंक्ति में दो दोहरे उद्धरण लगाने की आवश्यकता है। उदाहरण के लिए, @""""मूल्यांकन करता है "


1
@RichardEverett मैंने उत्तर को समझा, लेकिन मेरा संदेह है कि इस सुविधा का वास्तविक उपयोग क्या है?
अरुण

24
@ अरुण वास्तव में उपयोगी है जब स्ट्रिंग्स के साथ काम करते हैं जिसमें नियमित अभिव्यक्ति परिभाषाओं जैसी चीजें होती हैं जो अक्सर चीजों को खुद से बचने की आवश्यकता होती है
जेम्स थोर्प

25
+ बहु-पंक्ति सामग्री
जैदर

4
{{यदि आप string.Formatकॉल में नियमित ब्रेस का उपयोग करना चाहते हैं, तो आपको अभी भी ब्रेसिज़ को दोगुना करना होगा ।
डेव कजिनो

4
@RichardEverett टुकड़ों में रेखा को तोड़ने के बिना मल्टी लाइन स्ट्रिंग शाब्दिक बनाने के लिए बहुत उपयोगी है।
जॉन मोट

256

यह एक शब्दशः स्ट्रिंग शाब्दिक है । इसका मतलब है कि बचना लागू नहीं है। उदाहरण के लिए:

string verbatim = @"foo\bar";
string regular = "foo\\bar";

यहाँ verbatimऔर regularएक ही सामग्री है।

यह बहु-पंक्ति सामग्री को भी अनुमति देता है - जो SQL के लिए बहुत उपयोगी हो सकती है:

string select = @"
SELECT Foo
FROM Bar
WHERE Name='Baz'";

भागने की एक बिट जो शब्दशः स्ट्रिंग स्ट्रिंग शाब्दिकों के लिए आवश्यक है, एक दोहरे उद्धरण (") को प्राप्त करना है जो आप इसे दोगुना करते हैं:

string verbatim = @"He said, ""Would you like some coffee?"" and left.";
string regular = "He said, \"Would you like some coffee?\" and left.";

16
यह आरक्षित शब्दों को चर नाम और सामान के रूप में उपयोग करने की भी अनुमति देता है। सार्वजनिक int GetValueOrDefault (int @default) की तरह;
शविश

5
स्विश: सच है लेकिन इस विशिष्ट प्रश्न से असंबंधित है।
जॉन स्कीट

63

एक '@' का एक और अर्थ है: इसे एक चर घोषणा के सामने रखना आपको आरक्षित नामों को चर नामों के रूप में उपयोग करने की अनुमति देता है।

उदाहरण के लिए:

string @class = "something";
int @object = 1;

मैंने इसके लिए केवल एक या दो वैध उपयोग किए हैं। मुख्य रूप से ASP.NET MVC में जब आप ऐसा कुछ करना चाहते हैं:

<%= Html.ActionLink("Text", "Action", "Controller", null, new { @class = "some_css_class" })%>

जो एक HTML लिंक का उत्पादन करेगा जैसे:

<a href="/Controller/Action" class="some_css_class">Text</a>

अन्यथा आपको 'क्लास' का उपयोग करना होगा, जो एक आरक्षित कीवर्ड नहीं है लेकिन अपरकेस 'सी' HTML मानकों का पालन नहीं करता है और सिर्फ सही नहीं दिखता है।


18

चूँकि आपने स्पष्ट रूप से VB के लिए भी कहा है, इसलिए मुझे यह बताना चाहिए कि यह शब्दशः स्ट्रिंग सिंटैक्स VB में मौजूद नहीं है, केवल C # में। बल्कि, सभी स्ट्रिंग्स VB में शब्दशः हैं (इस तथ्य को छोड़कर कि वे सी # वर्बटीम स्ट्रिंग्स के विपरीत, लाइन ब्रेक शामिल नहीं कर सकते हैं):

Dim path = "C:\My\Path"
Dim message = "She said, ""Hello, beautiful world."""

VB में एस्केप सीक्वेंस मौजूद नहीं हैं (उद्धरण वर्ण के दोहरीकरण को छोड़कर, जैसे C # शब्दशः तार) जो कुछ चीजों को अधिक जटिल बनाता है। उदाहरण के लिए, VB में निम्नलिखित कोड लिखने के लिए आपको समसामयिकी (या स्ट्रिंग बनाने के लिए किसी भी अन्य तरीके) का उपयोग करना होगा

string x = "Foo\nbar";

VB में यह इस प्रकार लिखा जाएगा:

Dim x = "Foo" & Environment.NewLine & "bar"

( &VB स्ट्रिंग संघनन संचालक +समान रूप से इस्तेमाल किया जा सकता है।)


1
ओह मेरी, यह कष्टप्रद लगता है ... और भी अधिक खुशी है कि मैं C # का उपयोग कर रहा हूं: p
Svish

आप VB स्ट्रिंग शाब्दिक में पंक्ति विराम को एम्बेड नहीं कर सकते, भले ही आप C # के शब्दशः स्ट्रिंग शाब्दिक में हो। वे इस प्रकार समान नहीं हैं।
जोए

@ सविश, रुको क्या मुझे कुछ याद आ रहा है? यह वीबी के लिए बिल्कुल भी नहीं है। वास्तव में यह एक जगह है जहाँ VB C # जीतता है। यह यह इस तरह से करने के लिए बेहतर है और स्पष्ट रूप से नई-पंक्तियों और बदले के बीच सभी विशेष वर्ण फेंकने की विशेष वर्ण concat "और "
पेसियर 13

@ स्पेसियर बकवास है। जैसे ही आप तुच्छ स्ट्रिंग प्रसंस्करण से अधिक करते हैं, उचित स्ट्रिंग निर्माण सुविधाएं अपरिहार्य हैं, और विशेष रूप से विशेष वर्णों को संभालने की क्षमता इनमें से सबसे महत्वपूर्ण हैं। हालाँकि, C # और VB दोनों के पास है String.Format, जो ऐसा करने की अनुमति देता है। वास्तव में, मैं अब कभी नहीं लिखूंगा "x" & Environment.NewLine, और इसके बजाय हमेशा उपयोग करता हूं String.Format("x{0}", Environment.Newline)आदि। फिर भी, सी # यहां अधिक सुविधाजनक है।
कोनराड रुडोल्फ

@KonradRudolph, मैं निर्णय लेना होगा "x" & nl & nlया "x" + nl + nlया "x" . $nl . $nlअधिक किसी भी दिन "x\n\n"। साथ ही "x" + bs + bs खत्म "x\\\\"। और "x" + q + qओवर "x\"\""/ "x"""""। अब जैसा String.Formatकि, हम ऊपर कर रहे हैं कि तुलना में असंबंधित एक और मुद्दा है।
17

10

http://msdn.microsoft.com/en-us/library/aa691090.aspx

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

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

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


9

यह एक शब्दशः स्ट्रिंग है, और भागने के नियमों को बदल देता है - एकमात्र चरित्र जो अब बच गया है "," से बच गया है "" यह विशेष रूप से फ़ाइल पथ और regex के लिए उपयोगी है:

var path = @"c:\some\location";
var tsql = @"SELECT *
            FROM FOO
            WHERE Bar = 1";
var escaped = @"a "" b";

आदि


क्या आप @ उदाहरण में, मार्क को याद नहीं कर रहे हैं? या यह डिफ़ॉल्ट है जब मैं var का उपयोग करता हूं? थोड़ा उलझन में ...
डर्क वोल्मार

1
ठीक है - यह वास्तव में है, वास्तव में विषम है। मुझे आश्चर्य है कि अगर संपादक ने उन्हें कुतर दिया?
मार्क Gravell

9

MSDN से कॉपी किया गया :

संकलित समय में, वर्बेटिम स्ट्रिंग्स को सभी एक ही एस्केप सीक्वेंस के साथ साधारण स्ट्रिंग्स में बदल दिया जाता है। इसलिए, यदि आप डीबगर वॉच विंडो में एक वर्बिटिम स्ट्रिंग देखते हैं, तो आपको भागने वाले वर्ण दिखाई देंगे जो संकलक द्वारा जोड़े गए थे, आपके स्रोत कोड से वर्बेटिम संस्करण नहीं। उदाहरण के लिए, वर्बेटिम स्ट्रिंग @"C:\files.txt"घड़ी की खिड़की में दिखाई देगी "C:\\files.txt"


जो Microsoft प्रलेखन, IMHO का एक विशिष्ट भ्रामक टुकड़ा है! अंतिम परिणाम के रूप में उपरोक्त स्थिति सही है, लेकिन अंतर्निहित सच्चाई यह है कि C # में तार बाइट्स (या बहु-बाइट वर्ण कोड) के प्रासंगिक अनुक्रम में परिवर्तित हो जाते हैं। सी # अंतर्निहित स्ट्रिंग का प्रतिनिधित्व करने के लिए दो अलग-अलग तरीकों की अनुमति देता है, @ "..." या "..." के साथ। डिबगर हमेशा "..." रास्ता चुनता है, और यह नहीं बता सकता है कि पहली बार में किसका उपयोग किया गया था। (एस्केप सीक्वेंस जैसे कि \ n या "" केवल प्रोग्रामिंग और डिस्प्ले स्तर स्ट्रिंग प्रतिनिधित्व के लिए प्रासंगिक हैं, और अंतर्निहित स्ट्रिंग में कभी संग्रहीत नहीं होते हैं!)
माइकबेटन

8

लगाना a @ एक स्ट्रिंग के सामने आप विशेष कोड या भागने पात्रों का उपयोग किए बिना इस तरह के एक बैकस्लैश या डबल उद्धरण के रूप में विशेष वर्णों का उपयोग करने के लिए सक्षम बनाता है।

तो आप लिख सकते हैं:

string path = @"C:\My path\";

के बजाय:

string path = "C:\\My path\\";

3

स्पष्टीकरण सरल है। स्ट्रिंग का प्रतिनिधित्व करने के लिए "string\", संकलक की जरूरत है "string\\"क्योंकि \एक भागने चरित्र है। यदि आप @"string\"इसके बजाय उपयोग करते हैं, तो आप भूल सकते हैं \\

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