常规字符串和逐字字符串之间有什么区别?

Xai*_*oft 156 c# resharper

我有一个Resharper的试用版,它总是建议我将常规字符串切换为逐字字符串.有什么不同?

alc*_*379 177

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

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

将会

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

@符号表示从字面上读取该字符串,否则不解释控制字符.

  • 我相信这是一种编码惯例(我以前从未见过或听过).对于字符串,ReSharper建议将其移动到资源文件中进行本地化或逐字逐句 - 对于逐字字符串,ReSharper然后不再提供本地化字符串的选项.因此,使所有不需要本地化的字符串看起来像是一种惯例. (32认同)
  • 我想知道为什么Resharper建议这种改变.任何CLR专家都知道是否可以更有效地处理逐字字符串,因为可以忽略转义字符? (10认同)
  • 我想也许ReSharper建议它,因为逐字字符串更具可读性. (9认同)
  • 我想这是因为它更具可读性. (2认同)
  • @sanjeevbhusal:你真的没有那样做过.@"C:\ myfolder\myfile.txt"和"C:\\ myfolder \\ myfile.txt"与CLR是一回事.它基本上只是语法糖. (2认同)

Mar*_*ers 65

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

2.4.4.5字符串文字

C#支持两种形式的字符串文字:常规字符串文字和逐字字符串文字.

常规字符串文字由用双引号括起来的零个或多个字符组成,如"hello"中所示,并且可以包括简单转义序列(例如用于制表符的\ t)和十六进制和Unicode转义序列.

逐字字符串文字由@字符后跟双引号字符,零个或多个字符以及结束双引号字符组成.一个简单的例子就是@"你好".在逐字字符串文字中,分隔符之间的字符是逐字解释的,唯一的例外是quote-escape-sequence.特别是,简单的转义序列和十六进制和Unicode转义序列不会在逐字字符串文字中处理.逐字字符串文字可以跨越多行.

换句话说,@"verbatim string literal"中唯一的特殊字符是双引号字符.如果您希望编写包含双引号的逐字字符串,则必须编写两个双引号.所有其他字符都按字面解释.

您甚至可以在逐字字符串文字中包含文字新行.在常规字符串文字中,您不能使用文字新行.相反,你必须使用例如"\n".

逐字字符串文字通常用于在源代码中嵌入文件名和正则表达式,因为这些类型的字符串中的反斜杠很常见,如果使用常规字符串文字,则需要对其进行转义.

在运行时,从常规字符串文字创建的字符串和从逐字字符串文字创建的字符串之间没有区别 - 它们都是类型System.String.

  • 很好的触摸,感谢描述 (2认同)

Cor*_*rch 25

字符串和逐字字符串之间没有运行时差异.它们在编译时只是不同的.编译器在逐字字符串中接受较少的转义序列,因此您可以看到除了引用转义之外的其他内容.

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

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);
Run Code Online (Sandbox Code Playgroud)


Moh*_*deh 16

您也可以使用逐字字符串来创建多行字符串:

Console.WriteLine(@"This
    is
    a
    Test
    for stackoverflow");
Run Code Online (Sandbox Code Playgroud)

没有@你的错误.

在VB14中有一个叫做的新功能Multiline Strings,就像C#中的逐字字符串一样.

多行字符串

专业提示:VB字符串文字现在与C#逐字字符串完全相同.


Bol*_*ock 13

常规字符串使用特殊的转义序列转换为特殊字符.

/*
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\\");
Run Code Online (Sandbox Code Playgroud)

逐字字符串按原样解释,不转换任何转义序列:

/* 
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\\.");
Run Code Online (Sandbox Code Playgroud)