2009-02-17 52 views
416

這是C#(或可能VB.net)一個.NET的問題,但我試圖找出什麼是下面的聲明之間的區別:C#中字符串前的@是什麼?

string hello = "hello"; 

string hello_alias = @"hello"; 

印刷在控制檯上沒有區別,長度屬性是相同的。

回答

518

它標誌着字符串作爲verbatim string literal - 任何字符串中通常會被解釋爲escape sequence被忽略

。 210

因此"C:\\Users\\Rich"@"C:\Users\Rich"相同

有一個例外:雙引號需要轉義序列。爲了避免雙引號,您需要在連續放置兩個雙引號。例如,@""""評估爲"

+1

@RichardEverett我明白了一個swer,但我的疑問是這個功能的實際使用是什麼? – Arun 2014-06-28 14:32:13

+10

@Arun當處理包含像常規表達式定義這樣的東西的字符串時,它非常有用,它們通常需要事物才能自己逃脫 – 2015-05-22 14:40:03

+8

+多行內容 – Jaider 2015-09-01 20:49:48

185

這是一個逐字字符串文字。這意味着逃避不適用。例如:

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

這裏verbatimregular具有相同的內容。

它還允許多行的內容 - 這可以非常方便的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."; 
+11

它還允許使用保留字作爲變量的名稱和東西。像公共int GetValueOrDefault(INT @默認); – Svish 2009-02-17 11:09:52

+5

Svish:真,但與這個具體問題無關 – 2009-02-17 11:16:06

+1

不知道多行支持,只用於路徑... – user276648 2011-10-12 06:20:00

8

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

C#支持兩種形式的字符串文字:規則字符串和逐字字符串。

常規字符串文字由零個或多個用雙引號引起來的字符組成,如「hello」,並且可能包含簡單轉義序列(如製表符的\ t)以及十六進制和Unicode轉義序列。

逐字字符串文字由@後跟雙引號字符,零個或多個字符和一個閉合的雙引號字符組成。一個簡單的例子是@「你好」。在逐字字符串文字中,分隔符之間的字符是逐字解釋的,唯一的例外是引號轉義序列。特別是,簡單字符串文字中不處理簡單轉義序列和十六進制和Unicode轉義序列。逐字字符串文字可能跨越多行。

6

這是逐字的字符串,並改變轉義規則 - 就是現在躲過了唯一的文字是」逃往‘’這是文件路徑和正則表達式特別有用:

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

6

@放在字符串的前面使您可以使用特殊字符(如反斜槓或雙引號),而無需使用特殊代碼或轉義字符。

所以你可以這樣寫:

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

代替:

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

MSDN複製:

在編譯時,逐字字符串轉換爲與所有的普通字符串相同的轉義序列。因此,如果您在調試器觀察窗口中查看逐字字符串,則會看到編譯器添加的轉義字符,而不是源代碼中的逐字版本。例如,逐字字符串@"C:\files.txt"將作爲"C:\\files.txt"出現在監視窗口中。

13

既然您明確要求使用VB,那麼讓我補充一點,這個逐字字符串語法在VB中不存在,僅在C#中。相反,所有字符串逐字在VB(除了一個事實,即他們不能包含換行符,不像C#逐字字符串):

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字符串連接運算符,同樣可以使用+。)

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> 

否則,你將不得不使用「類」,這」不是個t保留關鍵字,但大寫'C'不遵循HTML標準,只是看起來不正確。

2

解釋很簡單。爲了表示字符串"string\",編譯器需要"string\\",因爲\是一個轉義字符。如果您使用@"string\"代替,則可以忘記\\

-2

要放任何字符串的「@」infront使其成爲字符串文字。一個更好的例子是

string String1 = "Hello""; 

string String2 = @"Hello""; 

第一個將是一個語法錯誤,其中的第二個會打印出你好」。