Странное поведение Console.Write () - PullRequest
2 голосов
/ 22 февраля 2020

Я создал простое консольное приложение, которое создает окно 16 x 16 и заполняет его некоторыми символами.

Проблема в том, что он работает нормально (и в соответствии с ожиданиями) только при запуске в Microsoft Visual Studio 2019. Не имеет значения, использую ли я режим отладки или выпуска. Но по какой-то причине, когда я пытаюсь запустить один и тот же .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-файла из выходной папки находится справа.

enter image description here enter image description here

Кроме того, вывод становится еще более поврежденным после сворачивания окна и его отображения снова (и границы исчезли):

enter image description here

1 Ответ

0 голосов
/ 23 февраля 2020

Я думаю, вы не можете избавиться от черных границ в cmd. Попробуйте использовать Console.WriteLine () и напечатать целую строку или просто добавьте Console.Write ("\ n") после внутреннего для l oop. Это сохранит ваше форматирование. Но в этом случае вы должны увеличить ширину буфера до 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");
        }

Код создает вывод как это:

Code output

Минимизация окна вызывает прокрутку консоли. Вы можете избавиться от этого, увеличив размер окна или применив рендеринг l oop, поскольку он очищает консоль и перемещает указатель вверх. C# вывод на консоль очень медленный, поэтому, если вы не сделаете его быстрее, ваш текст будет мерцать все время.

...