C# 逐字字符串缺少回车符

C# 逐字字符串缺少回车符,c#,line-endings,verbatim-string,C#,Line Endings,Verbatim String,我今天遇到了一个奇怪的问题。我有这样一个逐字的字符串: var s = @" 0 1 0 0" var s = " 0 1\r\n 0 0" var s = $" 0 1{Enviroment.NewLine}0 0"; i、 一条线之后有一条新的线。My Environment.NewLine设置为\r\n 这是单元测试的一部分,在过去的几个月里,测试一直运行良好。现在,当我运行测试时,上面的字符串声明将导致:

我今天遇到了一个奇怪的问题。我有这样一个逐字的字符串:

var s = @"     0     1
0     0"
var s = "     0     1\r\n    0     0"
var s = $"     0     1{Enviroment.NewLine}0     0";
i、 一条线之后有一条新的线。My Environment.NewLine设置为\r\n

这是单元测试的一部分,在过去的几个月里,测试一直运行良好。现在,当我运行测试时,上面的字符串声明将导致:

"     0     1\n     0     0"
而不是

"     0     1\r\n     0     0"
意味着测试失败

为了证明这是真的,我抛弃了所有的角色。我也尝试过不使用逐字记录字符串,而是这样:

var s = @"     0     1
0     0"
var s = "     0     1\r\n    0     0"
var s = $"     0     1{Enviroment.NewLine}0     0";
然后测试就通过了


有人知道这里会发生什么吗?

如果要在单元测试中使用字符串,最好确保内容始终相同。我建议这样声明:

var s = @"     0     1
0     0"
var s = "     0     1\r\n    0     0"
var s = $"     0     1{Enviroment.NewLine}0     0";

答案是:Git很可能将文件中的行尾替换为LF。依赖单元测试中的文件行结尾不是一个好主意,因此我更改了代码,以便在所有情况下显式指定换行符,因此:

var s = "     0     1\r\n    0     0"

您可以使用字符串插值和逐字记录来添加控制字符

var s = @$"     0     1{'\r'}
0     0"

可能您的源文件实际上只有\n-您是否尝试过删除中断并再次插入它,或者使用可以显示实际字节的内容查看该文件?就是这样!我尝试将代码复制并粘贴到notepad++中,但很明显,当我这样做时,它更正了行尾。如果我直接打开文件,由于某种原因,行尾已更改为仅取决于特定的行尾是危险的。源代码控制软件(例如Git)可能会根据用户的设置在“推”或“拉”模式下转换行尾。@cremor是的,我刚刚从中吸取了一个重要的教训。我想一定是Git做的:Environment.NewLine不能更改吗?我理解这不太可能。最好实际使用\r\n明确地使用Environment.NewLine可能会有所不同,具体取决于软件运行的操作系统。这取决于单元测试是如何实现的,它是否会中断。如果你在两个地方都使用environment.NewLine,它不会破坏单元测试。这是一个好的观点,我应该使用environment.NewLine来写数据。我不知道,谢谢。但是,上述操作不会导致0 1\r\r\n0 0?这取决于您使用哪个编辑器输入新行。