在测试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做出第一个答案。
答案 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后端对给定的字符串文字没有任何转换。 从字面上接受字符串文字(用于双关语)。