【问题标题】:Verbatim string is missing carriage return逐字字符串缺少回车符
【发布时间】:2019-10-21 09:23:01
【问题描述】:

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

var s = @"     0     1
0     0"

即之后有一个新行。我的 Environment.NewLine 设置为 \r\n

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

"     0     1\n     0     0"

而不是

"     0     1\r\n     0     0"

意味着测试失败。

我已经抛弃了每个角色来证明这是真的。我也尝试过不使用逐字字符串,如下所示:

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

然后测试通过。

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

【问题讨论】:

  • 也许您的源文件实际上只有\n - 您是否尝试过删除中断并再次插入它,或者查看文件中可以显示实际字节的内容?跨度>
  • 就是这样!我尝试将代码复制并粘贴到记事本++中,但显然当我这样做时,它更正了行尾。如果我直接打开文件,由于某种原因,行尾已更改为 LF#
  • 依赖于特定的行尾是危险的。源代码控制软件(例如 Git)可能会根据用户的设置在 push 或 pull 时转换行尾。
  • @cremor 是的,我刚刚在那里学到了重要的一课。
  • 我认为一定是 git 做到了。 :)

标签: c# line-endings verbatim-string


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    var s = $"     0     1{Enviroment.NewLine}0     0";
    

    【讨论】:

    • Environment.NewLine 不能改变吗?我很欣赏它不太可能。更好地实际使用 \r\n 明确
    • Enviroment.NewLine 可能因软件运行的操作系统而异。这取决于单元测试是否会中断。如果你在两个地方都使用Enviroment.NewLine,它不会破坏单元测试。
    • 这很好,我应该使用 environment.newline 写出数据。
    【解决方案3】:

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

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

    【讨论】:

    • 我不知道,谢谢。但是,上述内容不会导致 " 0 1\r\r\n0 0" 吗?
    • 取决于您使用哪个编辑器输入新行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2015-03-15
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多