C# 为什么可以';非逐字记录字符串是否包含换行符?

C# 为什么可以';非逐字记录字符串是否包含换行符?,c#,string,C#,String,我开始学习C#,我不明白为什么常规字符串文字(即,“”)不能包含文字换行符。(我不是说转义序列\n)。我知道必须对多行字符串使用逐字字符串文字(即,@“),但为什么 我没有看到它明确指出不能在常规字符串中使用它们。除此之外,除了顺便提到我可以使用逐字字符串外,我读到的所有内容似乎都表明,在常规字符串文本中允许使用文本换行符 并显示逐字多行字符串的示例,无需进一步解释 他说: 在C语言中,空格、制表符和换行符都被认为是空白。。。。在C#语句中,额外的空格通常被忽略。。。 这个规则的例外是字符串中

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

我没有看到它明确指出不能在常规字符串中使用它们。除此之外,除了顺便提到我可以使用逐字字符串外,我读到的所有内容似乎都表明,在常规字符串文本中允许使用文本换行符

并显示逐字多行字符串的示例,无需进一步解释

他说:

在C语言中,空格、制表符和换行符都被认为是空白。。。。在C#语句中,额外的空格通常被忽略。。。 这个规则的例外是字符串中的空白被视为文字;这是不容忽视的

那么这是字面意思?我也希望如此,但事实并非如此。
它甚至包括这个提示框:

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

(我意识到这是在谈论字符串之外的内容,但如果行尾不在字符串之外,为什么它在字符串内部具有特殊的解析意义?)

我终于找到了自己的路,但仍然没有获得任何洞察力:

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

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



显然,我能够从示例和VisualStudio错误中推断,如果逐字记录字符串包含文字换行符,则需要逐字记录字符串,但我所阅读的所有内容都表明情况不应该如此。为什么会有不同?

好吧,开枪吧。就在我提交这篇文章的时候,我找到了答案

“任何字符文字”中是否不包括文字换行符

显然,不,他们不是

:

字符文字:

“性格”

人物:

单个字符

单个字符:

'(U+0027)、\(U+005C)和新行字符以外的任何字符

可能受骗

简而言之,因为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" ;
<> P> > C++,java语言中的一个非常简单的规则:

你可以用它做你想做的事

这让我们可以使用格式的东西,但你想为可读性的好处。现在,Python迷可能会说,优势被高估了,但我们确实利用了这一优势

字符串中的换行符可能会把事情搞砸。如果您不确定源代码中的换行符是否意味着我们将
“\u000D”
“\u000A”
“\u000A\u000D”
”\u0085”
“\u000B”
“\u000C”
“\u2028”
“\u2029”
插入字符串,所有这些都有新行语义,前四个是不同系统的“唯一明智的新行方式,其他人都错了”


你仍然可以说,允许它的负面影响被高估了。毕竟,字符串的形式并不像人们所期望的那样从C++中得到。

我想它可能是“因为语言是如何工作的”。这可能是受到了新C#程序员将来自的其他语言的启发。正如您所提到的,您可以使用@prefix来定义一个逐字字符串常量。@MikeChristensen哦,是的,我尝试用反斜杠转义文字换行,就像我在C/C++中看到的那样。也不走运。但是为什么新行字符不包含在字符文字中?@ZaidMasud语言设计选择远远超出了我的问题范围。我的反对意见是,这个特性没有明确定义,事实上,它显然是明确定义的。是的,规范是一致的。对我来说,更多的是一种好奇的沉思。是的,我也尝试过拼接,但没有成功。我对此有点惊讶,因为如果这个限制是从C家族的祖先那里继承来的,我想它也会继承。是的,剪接感觉应该存在。一个可以与
+
连接的事实可能被视为消除了这种需要。我想“这有什么关系?”只要字符串最终以结束引号结束(如我所说)