首页 > 解决方案 > 奇怪的 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 文件时的错误结果在右侧。

在此处输入图像描述 在此处输入图像描述

在最小化窗口并再次显示它(并且边框消失)后,输出也会变得更加损坏:

在此处输入图像描述

标签: c#visual-studioconsole-application

解决方案


我猜你无法摆脱 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# 控制台输出非常慢,所以除非你让它更快,否则你的文本会一直闪烁。


推荐阅读