C#中需要使用回车和换行符吗?

34

在将新行字符插入字符串时,我通常会这样做:

str = "First line\nSecond line";

在C#中,这是标准做法吗?我是否应该包括回车符'\r'?以下两种方式有何区别?

str = "First line\nSecond line";
str = "First line\r\nSecond line";

如果同时使用“回车”和“换行”是标准做法,那么有特定的顺序吗?为什么?

注意:我在 Stack Overflow 上阅读了一些其他帖子,但没有找到针对 .NET/C# 的答案。

编辑:在测试一个小应用程序后,我没有看到 '\n' 和 '\n\r' 或 '\r\n' 之间的任何区别。


3
请看这里:用C#编写控制台应用程序并输出字符串以查看发生了什么。总的来说,我认为这与C#关系不大,更多地与Windows有关。 - dthorpe
你测试过哪些平台?Windows?Mac?Linux?移动端? - Jeroen Wiert Pluimers
我在 Windows 上工作,所以也许这可以解释它。说实话,这个问题主要是想找出原因和最佳实践。在 .NET 中似乎我应该始终使用 Environment.NewLine 常量。 - Luke Baulch
1
这取决于您打算如何处理该字符串。例如,如果您的字符串表示电子邮件标题,则必须以CR后跟LF结尾。为什么?这是规范定义标题终止符的方式。 - james.garriss
5个回答

73

System.Environment.NewLine是您要查找的常量 - http://msdn.microsoft.com/en-us/library/system.environment.newline.aspx ,它将提供特定于环境的组合,大多数给定操作系统上的程序都将视为“下一行文本”。

实际上,大多数文本工具将包括\n在内的所有变体都视为“新行”,因此您可以在文本中使用它"foo\nbar"。特别是如果您正在构建多行格式字符串,例如$"V1 = {value1}\nV2 = {value2}\n"。如果您正在使用字符串连接构建文本,请考虑使用NewLine。无论如何,请确保您使用的工具理解输出的方式,并且如果您选择的编辑器无法正确打开文件,则可能需要始终使用\r\n

请注意,WriteLine方法使用NewLine,因此如果您计划使用这些方法写入文本,则避免仅使用\n,因为结果文本可能包含\r\n\n混合使用,这可能会使一些工具产生困惑并且看起来不整洁。

有关历史背景,请参见\n和\r之间的区别?


3
我知道这个常量的存在,但是这是否意味着我们应该避免使用 \n 和 \r 字符呢?如果是,为什么? - Luke Baulch
7
@jonezy - 我不认为那是正确的;Environment.Newline 是整个可执行文件的常量(参见 msdn)。你能提供一个链接来解释这个值如何基于上下文吗? - David R Tribble

12

回车符\r会将光标移动到当前行的开头。换行符\n会跳到下一行并可能移到下一行的开头;这是与平台相关的部分,如Alexei在上面提到的(在*nix系统中\n会同时给出回车和换行,在Windows中则不会)。

你使用哪一个取决于你想要做什么。举个例子,如果我想在控制台上制作一个旋转的小图案,我可以这样做:str = "|\r/\r-\r\\\r";


控制台上的旋转物是我正在寻找的技巧。谢谢。 - John Prado

1
我知道这有点老了,但是任何偶然发现这个页面的人都应该知道\n和\r\n之间的区别。
\r\n表示回车换行符,而\n则表示换行符。一般来说,这两者在视觉上几乎没有什么区别。
将字符串创建为.txt文件,然后尝试在记事本中打开(正常的,不是notepad++),你会注意到它们之间的差异。
SHA,PCT,PRACTICE,BNF CODE,BNF NAME,ITEMS,NIC,ACT COST,QUANTITY,PERIOD
Q44,01C,N81002,0101021B0AAALAL,Sod Algin/Pot Bicarb_Susp S/F,3,20.48,19.05,2000,201901
Q44,01C,N81002,0101021B0AAAPAP,Sod Alginate/Pot Bicarb_Tab Chble 500mg,1,3.07,2.86,60,201901

上面的示例使用的是“CRLF”,下面是仅使用“LF”的效果(在LF位置有一个看不见的字符)。
SHA,PCT,PRACTICE,BNF CODE,BNF NAME,ITEMS,NIC,ACT COST,QUANTITY,PERIODQ44,01C,N81002,0101021B0AAALAL,Sod Algin/Pot Bicarb_Susp S/F,3,20.48,19.05,2000,201901Q44,01C,N81002,0101021B0AAAPAP,Sod Alginate/Pot Bicarb_Tab Chble 500mg,1,3.07,2.86,60,201901

如果需要更正行尾并且文件足够小,则可以在NotePad ++中更改行尾(或将其粘贴到Word中,然后再次粘贴到NotePad中-尽管这样只会生成CRLF)。
这可能会导致一些读取这些文件的功能潜在地无法正常运行(给出的示例行来自GP处方数据-英格兰。该文件已从CRLF行末更改为LF行末)。 这使得一个SSIS作业停止运行,并因无法读取LF行末而失败。
行尾信息来源: https://en.wikipedia.org/wiki/Newline#Representations_in_different_character_encoding_specifications 希望这能帮助将来需要的人 :) CRLF =基于Windows,LF或CF来自Unix based systems(例如Linux,MacOS等)。

1

这取决于您要在哪里显示文本。例如,在控制台或文本框中,\n就足够了。但是在RichTextBox中,我认为您需要两者都使用。


0

这是一个好习惯,虽然不总是必需的,但 Windows 标准是要包含两者。

\n 实际上代表一个换行符,或数字 10,在终端和电传打字机上,换行符通常只意味着“向下移动一行”。

\r 代表回车符 CR,或数字 13。在 Windows、Unix 和大多数终端上,CR 将光标移动到行首。(对于 8 位计算机来说情况并非如此:大多数计算机使用 CR 来进入下一行。)

无论如何,某些进程(例如文本控制台)可能会在发送 LF 时自动添加 CR。但是,由于 CR 只是将光标移动到行首,因此发送两次 CR 不会有任何影响。

另一方面,对话框、文本框和其他显示元素需要同时使用 CR 和 LF 才能正确开始新行。

既然同时发送两者没有任何缺点,并且在某些情况下两者都是必需的,那么最简单的策略就是如果不确定,就同时使用两者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接