【问题标题】:C# : Manually creating a console.writelineC#:手动创建一个 console.writeline
【发布时间】:2012-09-12 13:51:13
【问题描述】:

我正在尝试手动模拟 Console.Writeline。 即:我正在创建一个带有函数 WriteLine 的小型控制台类。 请参阅下面的代码:

static class Console
{
    public static string WriteLine(string text)
    {
        return text;
    }
}

所以我尝试了:

class Program
{
    static void Main()
    {
        Console.WriteLine("HiMan");
    }
}
static class Console
{
    public static string WriteLine(string text)
    {
        return text;
    }
}

我知道它会返回文本,但是如何在不使用 Write 或 Writeline 方法的情况下将其显示在屏幕上?

我创建这个示例是为了让人们了解类是如何工作的,以及为什么当我使用 WriteLine 或 Write() 时它会在控制台窗口中显示文本。

【问题讨论】:

  • 如果你想知道Console类是如何工作的,我建议你阅读documentation
  • 你绝对可以使用一些低级的 pinvoke,brb 和答案......
  • “课程如何运作?”的正确答案应该与语言和功能无关。类是一个类,无论是 C#、Java 等。继承、封装等概念也是如此……
  • 调用WriteConsole Win32 api。 stackoverflow.com/a/7325554/1429439
  • 那么你想让你的模拟控制台在不使用控制台类的情况下写入 shell 的缓冲区吗?您想让您的控制台写入 Windows 窗体上的文本框(或使用自定义 UI 仅显示文本的其他情况)吗?您想从文件中读取输入并将输出写入文件吗?您是否只想跟踪内存中控制台的内容(比如stringstringbuilder 或类似名称)?

标签: c# class methods


【解决方案1】:

这取决于你想去多深。 Console.WriteLine() 在内部调用 Console.Out 上的 WriteLine。 Console.Out 是一个TextWriter,它提供了 WriteLine 实现。您始终可以通过直接将字节写入流来实现自己的 WriteLine。

如果你想更深入,例如直接写入控制台缓冲区,请注意控制台的 Out、In 和 Error 属性都是可重定向的,忽略它们可能会导致问题,例如无法重定向输入并在命令行上使用管道输出。

【讨论】:

    【解决方案2】:

    我猜您想在相当低的级别上执行此操作。我使用ReadConsoleOutputWriteConsoleOutput 直接读写控制台的显示,而Console.WriteLine 不允许我这样做(这些对于复古的2d 控制台游戏来说非常棒,我的初衷)。

    PInvoke 链接:ReadConsoleOutput | WriteConsoleOutput

    您可能不需要ReadConsoleOutput,但对于那些在谷歌上搜索此页面的人来说,这些方法有点相辅相成。

    如果你想通过键盘阅读,我相信你可以使用ReadConsoleInput,但我还没有真正尝试过。对这个建议有点怀疑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 2011-05-08
      • 2022-10-13
      • 2014-12-16
      • 1970-01-01
      相关资源
      最近更新 更多