這是C#(或可能VB.net)一個.NET的問題,但我試圖找出什麼是下面的聲明之間的區別:C#中字符串前的@是什麼?
string hello = "hello";
與
string hello_alias = @"hello";
印刷在控制檯上沒有區別,長度屬性是相同的。
這是C#(或可能VB.net)一個.NET的問題,但我試圖找出什麼是下面的聲明之間的區別:C#中字符串前的@是什麼?
string hello = "hello";
與
string hello_alias = @"hello";
印刷在控制檯上沒有區別,長度屬性是相同的。
它標誌着字符串作爲verbatim string literal - 任何字符串中通常會被解釋爲escape sequence被忽略
。 210因此"C:\\Users\\Rich"
與@"C:\Users\Rich"
相同
有一個例外:雙引號需要轉義序列。爲了避免雙引號,您需要在連續放置兩個雙引號。例如,@""""
評估爲"
。
這是一個逐字字符串文字。這意味着逃避不適用。例如:
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.";
它還允許使用保留字作爲變量的名稱和東西。像公共int GetValueOrDefault(INT @默認); – Svish 2009-02-17 11:09:52
Svish:真,但與這個具體問題無關 – 2009-02-17 11:16:06
不知道多行支持,只用於路徑... – user276648 2011-10-12 06:20:00
http://msdn.microsoft.com/en-us/library/aa691090.aspx
C#支持兩種形式的字符串文字:規則字符串和逐字字符串。
常規字符串文字由零個或多個用雙引號引起來的字符組成,如「hello」,並且可能包含簡單轉義序列(如製表符的\ t)以及十六進制和Unicode轉義序列。
逐字字符串文字由@後跟雙引號字符,零個或多個字符和一個閉合的雙引號字符組成。一個簡單的例子是@「你好」。在逐字字符串文字中,分隔符之間的字符是逐字解釋的,唯一的例外是引號轉義序列。特別是,簡單字符串文字中不處理簡單轉義序列和十六進制和Unicode轉義序列。逐字字符串文字可能跨越多行。
這是逐字的字符串,並改變轉義規則 - 就是現在躲過了唯一的文字是」逃往‘’這是文件路徑和正則表達式特別有用:
var path = @"c:\some\location";
var tsql = @"SELECT *
FROM FOO
WHERE Bar = 1";
var escaped = @"a "" b";
等
。將@
放在字符串的前面使您可以使用特殊字符(如反斜槓或雙引號),而無需使用特殊代碼或轉義字符。
所以你可以這樣寫:
string path = @"C:\My path\";
代替:
string path = "C:\\My path\\";
從MSDN複製:
在編譯時,逐字字符串轉換爲與所有的普通字符串相同的轉義序列。因此,如果您在調試器觀察窗口中查看逐字字符串,則會看到編譯器添加的轉義字符,而不是源代碼中的逐字版本。例如,逐字字符串
@"C:\files.txt"
將作爲"C:\\files.txt"
出現在監視窗口中。
既然您明確要求使用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字符串連接運算符,同樣可以使用+
。)
'@'還有另一個含義:將變量聲明放在變量聲明的前面可以使用保留關鍵字作爲變量名稱。
例如:
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標準,只是看起來不正確。
解釋很簡單。爲了表示字符串"string\"
,編譯器需要"string\\"
,因爲\
是一個轉義字符。如果您使用@"string\"
代替,則可以忘記\\
。
要放任何字符串的「@」infront使其成爲字符串文字。一個更好的例子是
string String1 = "Hello"";
和
string String2 = @"Hello"";
第一個將是一個語法錯誤,其中的第二個會打印出你好」。
@RichardEverett我明白了一個swer,但我的疑問是這個功能的實際使用是什麼? – Arun 2014-06-28 14:32:13
@Arun當處理包含像常規表達式定義這樣的東西的字符串時,它非常有用,它們通常需要事物才能自己逃脫 – 2015-05-22 14:40:03
+多行內容 – Jaider 2015-09-01 20:49:48