新行+制表符的字符串常量
本文关键字:字符串 常量 制表符 新行 | 更新日期: 2023-09-27 18:17:54
我想要一个c# 4字符串常量来表示新行和制表符,如下所示:
internal const string segment = "'r'n't";
我知道有环境。换行符,我想我可以这样使用:
internal const string segment = Environment.NewLine + "'t";
我的问题是什么是最有效的方式来构建一个字符串常量,有一个新的行和一个制表符?
如果如上所述将字符串声明为const
,则在效率方面绝对没有区别。任何常量都将在编译时被替换,并使用一个内部字符串。
不幸的是,第二个选项不是编译时间常数,不会编译。为了使用它,您需要将其声明为:
internal static readonly string segment = Environment.NewLine + "'t";
我个人认为,就意图而言,这是非常清楚的,这将是我的首选,即使它不会成为编译时常数。额外的开销/效率损失是如此小得令人难以置信,以至于我个人宁愿选择清晰的意图和易读的代码,而不是编译时间常数。
请注意,如果将此代码移植到Mono,使用Environment.NewLine
还具有正确的好处,并且您的目标是使用当前平台的行分隔符。在这种情况下,前者在非windows平台上是不正确的。如果您的目标是专门包含"'r'n't"
,并且不需要特定于平台的行分隔符,那么Environment.NewLine
将是一个不合适的选择。
const
不能工作。使用static readonly
.
internal static readonly string segment = Environment.NewLine + "'t";
纯粹的速度效率,那么第一个将获胜,特别是因为第二个不能制作const
,然后无法编译。
不过,第二种确实会非常快,所以我不在乎。
更重要的是,它们显然不是一回事。
归根结底就是"你为什么要用'r'n't"?
如果你使用'r'n't,因为你是在Windows上,而Windows上的换行符通常是'r'n,那么你绝对应该使用:
internal static readonly string segment = Environment.NewLine + "'t";
使用另一种是错误的,并且可能会引入数年都不会看到的bug。
如果你正在使用'r'n,因为你正在使用一个规范,说"用一个CRLF后跟一个制表符分隔段",那么你绝对应该使用:
internal const string segment = "'r'n't";
使用另一个是错误的。
这是真的咬人的东西。Windows用户编写的HTTP代码恰好在头和正文之间使用Windows换行符。然后它被移植到换行符为'n的地方,因为无论系统使用什么,HTTP都要求'r'n。反之亦然
(在严格/允许原则下,假设其他代码会一直出错,并接受所有不同的换行符形式也是一个好主意)