常规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.String
types。
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。