为什么非逐字字符串不能包含换行符?

时间:2012-08-30 21:56:26

标签: c# string

我开始学习C#,我不明白为什么常规字符串文字(即" ")不能包含文字换行符。 (我不是在谈论转义序列\n)。我知道你必须对多行字符串使用逐字字符串文字(即@" "),但为什么呢?

regular string produces "Newline in constant" error verbatim string produces no error

我没有看到它明确声明你不能在常规字符串中使用它们。不仅如此,除了传递中我可以使用逐字字符串的地方之外,我读过的所有内容似乎都表明在常规字符串文字中允许使用文字换行符。

Beginning Visual C# 2010Code: Generating Multiline String Literals (Visual C#)显示了逐字多线字符串的示例,没有进一步说明。

Learning C# 3.0说:

  

在C#语言中,空格,制表符和换行符被认为是空格....在C#语句中通常会忽略额外的空格。 ...   此规则的例外是字符串中的空格被视为文字;它不会被忽视。

所以这是字面意思?这也是我所期望的,但事实并非如此 它甚至包括这个提示框:

  

提示
  Visual Basic程序员注意到:在C#中,行尾没有特殊意义。语句以分号结束,而不是换行符。没有行继续符,因为不需要。

(我知道这是在字符串之外讨论,但是如果字符串不在字符串之外,为什么行结尾会在字符串内部具有特殊的解析意义?)

终于找到了string (C# Reference)本身的路,我仍然没有找到任何见解:

  

字符串文字可以包含任何字符文字。包括转义序列。以下示例使用转义序列\\表示反斜杠,\u0066表示字母f,\n表示换行符。

它表示可以使用转义序列 ,但它并未说明必须使用。字面换行字符是否未包含在“任何字符文字”中?如果我有一个包含文字制表符而不是其转义序列\t的字符串,则没有错误。但如果我有一个字面换行符,我会收到错误。我甚至将文件的行结尾从\r\n更改为\n\r,无效。


显然,我能够从示例和Visual Studio错误中推断,如果它包含一个文字换行符,则需要逐字字符串,但我读过的所有内容都表明不应该是这种情况。为什么不同?

3 个答案:

答案 0 :(得分:5)

好吧,拍。正如我提交的那样,我找到了答案。

  

字面换行字符是否未包含在"任何字符文字"?

显然,不,他们不是。

2.4.4.4 Character literals

  

字符字面:

     
    

'字符'

  
     

字符:

     
    

单字符

  
     

单字符:

     
    

'之外的任何字符(U + 0027),\(U + 005C)和换行符

  

答案 1 :(得分:1)

Why must C/C++ string literal declarations be single-line?

的可能欺骗

简而言之,因为C语言不支持它。

一个字符串文字未打开的拼写错误会将文件的其余部分作为单个标记丢弃,从而给程序员留下编译器错误消息,其中包括“期望在xxx行,yyy列的分号”,其中指示的位置是源文件的末尾。

大多数情况下,您不使用多行文字。最好从用户体验的角度来明确它们。

此外,在受限制的环境中,C语言是在(8K PDP-11?)中开发的,我怀疑这种溢出可能会使编译器崩溃。

C语言确实支持文字拼接,这很有帮助:

char *txt = "this is line 1\n"
            "this is line 2\n"
            "this is line 3\n"
            ;

它还支持线拼接:

char *txt = "this is my\n\
 multi-line string literal\n\
 isn't it nice?\n" ;

我希望C#的功能。

答案 2 :(得分:1)

C#(以及影响其语法的C ++,C,Java)对空格有一个非常简单的规则:

你可以用它做你想做的事。

为了便于阅读,我们可以根据需要使用格式化的东西。现在,Python粉丝可能会说优势被高估了,但这是一个优势,我们确实可以利用。

字符串中的换行符可能会搞砸了。如果您不确定来源中的换行符是否意味着我们插入"\u000D""\u000A""\u000A\u000D""\u0085""\u000B""\u000C""\u2028""\u2029"进入字符串,所有这些都有换行符语义,其中前四个是不同系统的“只做出换行的理智方式,其他人都错了”

你仍然可以争辩说允许它的缺点被高估了。毕竟,C#确实是人们可能期望从C ++等的字符串形式。 允许它。