常规string和逐字string有什么区别?

我有一个Resharper的试用版本,它总是build议我将常规string切换为逐字string。 有什么不同?

逐字string是一个不需要转义的string,如文件名:

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

将会

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

@符号意味着从字面上读取该string,否则不要解释控制字符。

这在C#规范的2.4.4.5节中有介绍 :

2.4.4.5string文字

C#支持两种forms的string文字:常规string文字和逐字string文字。

常规string文字由零个或多个用双引号引起来的字符组成,如“hello”,并且可能包含简单转义序列(如制表符的\ t)以及hex和Unicode转义序列。

逐字string文字由一个@字符,后跟一个双引号字符,零个或多个字符以及一个双引号字符组成。 一个简单的例子是@“你好”。 在逐字string文字中,分隔符之间的字符是逐字解释的,唯一的例外是一个quote-escape-sequence。 特别是,简单string文字中不处理简单的转义序列和hex和Unicode转义序列。 逐字string文字可能跨越多行。

换句话说,@“逐字串字面值”中唯一的特殊字符是双引号字符。 如果你想写一个包含双引号的逐字string,你必须写两个双引号。 所有其他字符都按字面解释。

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

逐字string文字常常用于在源代码中embedded文件名和正则expression式,因为这些types的string中的反斜杠是常见的,如果使用常规string文字,则需要将其转义。

从常规string文字创build的string和从逐字string文字创build的string之间在运行时没有区别 – 它们都是System.Stringtypes。

string和逐字string之间没有运行时差异。 它们在编译时只有不同。 编译器在逐字string中接受更less的转义序列,所以除了引号转义之外,你所看到的是什么。

您还可以使用逐字符@来告诉编译器将关键字视为名称:

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

常规string使用特殊的转义序列转换为特殊字符。

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

逐字string被解释为是,没有翻译任何转义序列:

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

你也可以使用逐字串:

 Console.WriteLine(@"This is a Test for stackoverflow"); 

没有@你有错误。

在VB14中有一个叫做Multiline Strings的新特性,就像C#中的逐字string。

多行字符串

专业提示:VBstring文字现在完全像C#逐字string。