c# - student - 常規字符串和逐字字符串之間有什麼區別?




resharper教學 (4)

字符串和逐字字符串之間沒有運行時差異。 它們在編譯時僅有不同。 編譯器在一個逐字字符串中接受較少的轉義序列,所以你看到的是你所得到的不是一個引號轉義。

您還可以使用逐字字符@來告知編譯器將關鍵字視為名稱:

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);

我有一個Resharper的試用版,它總是暗示我將常規字符串切換為逐字字符串。 有什麼不同?


常規字符串使用特殊的轉義序列轉換為特殊字符。

/*
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\\");

逐字字符串按原樣解釋,無需轉換任何轉義序列:

/* 
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\\.");

逐字字符串是不需要轉義的字符串,如文件名:

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

將會

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

@符號意味著從字面上讀取該字符串,否則不要解釋控製字符。


在C#規範的2.4.4.5節中有介紹

2.4.4.5字符串文字

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

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

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

換句話說,@“逐字串字面值”中唯一的特殊字符是雙引號字符。 如果你想寫一個包含雙引號的逐字字符串,你必須寫兩個雙引號。 所有其他字符都按字面解釋。

你甚至可以在一個逐字字符串文字中有字面的新行。 在一個普通的字符串文字中,你不能有新的文字行。 相反,您必須使用例如"\n"

逐字字符串文字常常用於在源代碼中嵌入文件名和正則表達式,因為這些類型的字符串中的反斜杠是常見的,並且如果使用常規字符串文字,則需要轉義。

從常規字符串文字創建的字符串與從逐字字符串文字創建的字符串之間在運行時沒有區別 - 它們都是System.String類型。





resharper