在某些情况下,dotnetfiddle.net会将换行符生成为\ n而不是\ r \ n

时间:2019-03-29 11:18:45

标签: c# .net .net-fiddle

在测试dotnetfiddle.net中的一些代码片段时,我注意到了奇怪的现象。

如果verbatim string literal(字符串以@"开始)中包含换行符,则编译器将在输出字符串中以\n而不是\r\n的形式发出换行符。 (例如,Environment.NewLine在所有情况下都会产生\r\n

下面的示例代码也可以在https://dotnetfiddle.net/53qGTM中找到:

string verbatimString = @"L1
L2";

string normalString = @"L1" + Environment.NewLine + "L2";

Console.WriteLine("=====Verbatim=====");
foreach (char c in verbatimString)
{
    Console.WriteLine("ascii:" + (int)c + ", char:" + c);
}

Console.WriteLine("=====Normal=====");
foreach (char c in normalString)
{
    Console.WriteLine("ascii:" + (int)c + ", char:" + c);
}

输出:

=====Verbatim=====
ascii:76, char:L
ascii:49, char:1
ascii:10, char:

ascii:76, char:L
ascii:50, char:2
=====Normal=====
ascii:76, char:L
ascii:49, char:1
ascii:13, char: 
ascii:10, char:

ascii:76, char:L
ascii:50, char:2

在Visual Studio中编译相同的代码时,在两种情况下换行符都是正确的\r\n。似乎是dotnetfiddle-compiler中的错误,是吗?

在进行一些调查的同时,我还假设发生了什么,我还将对这个问题as recommended做出第一个答案。

1 个答案:

答案 0 :(得分:2)

dotnetfiddle.net在后端执行代码编译和执行。运行代码段时,代码编辑器Web视图将代码作为json发送到后端,并将输出作为json接收。

作为我的代码执行的一部分,发送了以下json字符串(在chrome dev工具中拥有):

"CodeBlock": "using System;\n\npublic class Program\n{\n\tpublic static void Main()\n\t{\n\t\tstring verbatimString = @\"L1\nL2\";\n\t\tstring normalString = @\"L1\" + Environment.NewLine + \"L2\";\n\t\tConsole.WriteLine(\"=====Verbatim=====\");\n\t\tforeach (char c in verbatimString)\n\t\t{\n\t\t\tConsole.WriteLine(\"ascii:\" + (int)c + \", char:\" + c);\n\t\t}\n\n\t\tConsole.WriteLine(\"=====Normal=====\");\n\t\tforeach (char c in normalString)\n\t\t{\n\t\t\tConsole.WriteLine(\"ascii:\" + (int)c + \", char:\" + c);\n\t\t}\n\t}\n}"

在json中,我的verbatingString变量定义如下:string verbatimString = @\"L1\nL2\";

我的字符串文字中嵌入了标准的json换行符\n。似乎dotnetfiddle后端对给定的字符串文字没有任何转换。 从字面上接受字符串文字(用于双关语)。