为什么在StringBuilder中写入然后立即删除space?
Why write and then immediately remove space in StringBuilder?
我正在尝试从要点 (Console progress bar by DanielSWolf) 理解源代码。
他写这个是为了在后台做一些工作时在控制台中显示进度条。
窃取了他的 SO 答案 here.
有一行代码我没看懂(row 68):
// If the new text is shorter than the old one: delete overlapping characters
int overlapCount = currentText.Length - text.Length;
if (overlapCount > 0) {
outputBuilder.Append(' ', overlapCount);
outputBuilder.Append('\b', overlapCount);
}
此代码由他的计时器处理程序调用(每个计时器滴答调用)。
我找不到保留这 5 行代码的目的。
这是为了防止控制台显示错误吗?
正如评论所暗示的那样:如果新的文本行较短,则需要删除重叠的字符,以免出现如下内容:
Performing some task... [#########-] 99%
Performing some task... Done.#####-] 99%
假设当前控制台上的文本是
|Long, long old text
文本光标位于行首(用“|”表示)。您想要将文本替换为 "New text"
(这是一个较短的字符串)。您在旧字符串 上打印新字符串 ,到达:
New text|ng old text
光标在中间,旧文本的结尾仍然显示。所以你打印了一些 space 个字符来覆盖那些旧字符,最后是
New text |
现在,根据您尝试实现的目标,您可能希望将文本光标移回文本末尾。将文本光标向后移动是通过打印 \b
(向后 space)个字符来完成的。打印 backspace 字符不会在控制台上产生任何输出,它只是将光标向后移动一个字符。结果是这样的:
New text|
我正在尝试从要点 (Console progress bar by DanielSWolf) 理解源代码。
他写这个是为了在后台做一些工作时在控制台中显示进度条。
窃取了他的 SO 答案 here.
有一行代码我没看懂(row 68):
// If the new text is shorter than the old one: delete overlapping characters
int overlapCount = currentText.Length - text.Length;
if (overlapCount > 0) {
outputBuilder.Append(' ', overlapCount);
outputBuilder.Append('\b', overlapCount);
}
此代码由他的计时器处理程序调用(每个计时器滴答调用)。
我找不到保留这 5 行代码的目的。
这是为了防止控制台显示错误吗?
正如评论所暗示的那样:如果新的文本行较短,则需要删除重叠的字符,以免出现如下内容:
Performing some task... [#########-] 99%
Performing some task... Done.#####-] 99%
假设当前控制台上的文本是
|Long, long old text
文本光标位于行首(用“|”表示)。您想要将文本替换为 "New text"
(这是一个较短的字符串)。您在旧字符串 上打印新字符串 ,到达:
New text|ng old text
光标在中间,旧文本的结尾仍然显示。所以你打印了一些 space 个字符来覆盖那些旧字符,最后是
New text |
现在,根据您尝试实现的目标,您可能希望将文本光标移回文本末尾。将文本光标向后移动是通过打印 \b
(向后 space)个字符来完成的。打印 backspace 字符不会在控制台上产生任何输出,它只是将光标向后移动一个字符。结果是这样的:
New text|