2009-02-17 6 views
416

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

string hello = "hello"; 

बनाम

string hello_alias = @"hello"; 

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

उत्तर

518

यह के रूप में एक verbatim string literal स्ट्रिंग के निशान - स्ट्रिंग में कुछ भी है कि सामान्य रूप से एक escape sequence रूप में दर्शाया जाएगा नजरअंदाज कर दिया है

। एक एस्केप अनुक्रम दोहरे उद्धरण के लिए आवश्यक है: 210

तो "C:\\Users\\Rich" रूप @"C:\Users\Rich"

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

+1

@RichardEverett मुझे समझ में आया एक झुकाओ, लेकिन मेरा शक यह है कि इस सुविधा का वास्तविक उपयोग क्या है? – Arun

+10

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

+8

+ बहु लाइन सामग्री के साथ आप भी अभी भी ब्रेसिज़ अप दोगुना करने के लिए 'होगा – Jaider

185

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

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

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

यह भी बहु लाइन सामग्री की अनुमति देता है - जो एसक्यूएल के लिए बहुत आसान हो सकता है:

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."; 
+11

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

+5

स्विस: इस विशिष्ट प्रश्न से सच लेकिन असंबद्ध। –

+1

मल्टीलाइन समर्थन के बारे में नहीं पता था, केवल पथों के लिए इसका उपयोग किया गया था ... – user276648

8

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

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

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

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

6

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

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

आदि

+0

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

+1

मार्क बस मेरी पहले त्रुटियों :) –

+0

को सही करने के लिए धन्यवाद नकल किया गया था;) –

6

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

तो तुम लिख सकते हैं:

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

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

string path = @"C:\My path\"; 
बजाय

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

+0

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

13

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

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

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

string x = "Foo\nbar"; 

वीबी में यह लिखा जाएगा संयोजन उपयोग करने की आवश्यकता लिखने के लिए:

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

एक (& वीबी स्ट्रिंग संयोजन ऑपरेटर है + समान रूप से इस्तेमाल किया जा सकता है।।)

+0

हे, कि कष्टप्रद लगता है ... और भी खुशी है कि मैं अब सी # का उपयोग कर रहा : पी – Svish

+0

आप वीबी स्ट्रिंग अक्षर में लाइन ब्रेक एम्बेड नहीं कर सकते हैं, भले ही आप सी # के वर्बैटिम स्ट्रिंग अक्षर में हों। वे इस तरह एक समान नहीं हैं। – Joey

+0

@ जॉय अच्छी टिप्पणी, जोड़ देगा। –

42

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

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

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> 

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

+2

सही लेकिन – user829755

2

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

-2

किसी भी स्ट्रिंग के "@" को रखने के लिए यह एक स्ट्रिंग अक्षर बनाता है।एक बेहतर उदाहरण

string String1 = "Hello""; 

और

string String2 = @"Hello""; 

पहले एक एक सिंटैक्स त्रुटि के रूप में एक दूसरे के बाहर नमस्कार प्रिंट होगा जहां "होने जा रहा है हो सकता है।

+0

के लिए नहीं कहा दूसरा एक अभी भी एक सिंटैक्स त्रुटि हो जाएगा - के दूसरे भाग को देखने के [इस उत्तर] (https://stackoverflow.com/a/556142/5456631) – Muntasir

संबंधित मुद्दे