c# - 奇怪的 Console.Write() 行为
问题描述
我创建了一个简单的控制台应用程序,它创建了一个 16 x 16 的窗口并用一些字符填充它。
问题是,只有当我在 Microsoft Visual Studio 2019 中启动它时它才能正常运行(并且符合预期)。我使用的是 Debug 还是 Release 模式都没有关系。但是由于某种原因,当我尝试从文件夹控制台输出运行相同的 .exe 文件时,它会损坏。
此外,窗口的右侧和底部还有奇怪的边框。我猜这个空间可能是为滚动条保留的,但有时当我在 Visual Studio 中运行我的应用程序时,不会出现边框。最终我想做一个主机游戏,所以这些看似随机出现的边框将是一个问题。
我的代码:
using System;
namespace App
{
class Program
{
static void Main(string[] args)
{
Console.SetWindowSize(16, 16);
Console.SetBufferSize(16, 16);
//Console.CursorVisible = false;
for(int x = 0; x < 16; x++)
for (int y = 0; y < 16; y++)
Console.Write(x.ToString("X"));
while(true) { } // prevents window from closing instantly
}
}
}
从 Visual Studio 运行时的正确结果在左侧,从输出文件夹运行相同的 exe 文件时的错误结果在右侧。
在最小化窗口并再次显示它(并且边框消失)后,输出也会变得更加损坏:
解决方案
我猜你无法摆脱 cmd 中的黑色边框。尝试使用 Console.WriteLine() 并打印一整行,或者在内部 for 循环之后添加 Console.Write("\n") 。这将保留您的格式。但在这种情况下,您必须将缓冲区宽度增加到 17(16 个符号 + '\n')。
此外,如果您的 WindowSize 小于 BufferSize,您将获得滚动条而不是黑色边框。
我稍微修改了你的代码:
Console.SetBufferSize(17, 17);
//Console.CursorVisible = false;
for (int x = 0; x < 16; x++)
{
for (int y = 0; y < 16; y++)
Console.Write(x.ToString("X"));
Console.Write("\n");
}
代码创建如下输出:
最小化窗口会导致控制台滚动。您可以通过增加窗口大小或在清除控制台并将指针移动到顶部时实现渲染循环来摆脱这种情况。C# 控制台输出非常慢,所以除非你让它更快,否则你的文本会一直闪烁。
推荐阅读
- android - onActivityResult 不返回成功
- angular - 为什么单击复选框时未触发更改检测?
- angular - Ag-Grid - 单元格下拉复选框
- php - 无法在生产环境中访问 laravel 中的 env 和 config 功能
- android - Firebase 分析日志未显示自定义事件
- laravel - 如何在模型的雄辩关系中搜索术语?
- r - 循环ggplot2多元线性回归
- c# - c# 将列表转换为数组
- flutter - 如果小部件在 FittedBox 中,如何设置其大小以忽略 FittedBox 的设置?
- sqlite - 来自 StreamBuilder 的存储数据