C#/.NET控制台应用程序的行为与普通Unix工具类似

C#/.NET控制台应用程序的行为与普通Unix工具类似,c#,windows,unix,software-design,C#,Windows,Unix,Software Design,这个问题是关于在.NET中设计行为类似于普通Unix工具的控制台应用程序。Unix工具的基本原理是,它们可以与一个工具链接在一起,该工具能够从任何兼容的流获取输入,并向任何兼容的流提供输出 如果我在.NET for Windows中编写控制台应用程序,我需要遵循哪些常规事项才能使我的工具具有相同的类型?使用*nix工具的主要原则是 假设我开始创建一个*nix样式的工具,将输入转换为大写。这是一个微不足道的例子,但这让我可以在这里发布整个程序 以下是源代码: using System; using

这个问题是关于在.NET中设计行为类似于普通Unix工具的控制台应用程序。Unix工具的基本原理是,它们可以与一个工具链接在一起,该工具能够从任何兼容的
获取输入,并向任何兼容的
提供输出


如果我在.NET for Windows中编写控制台应用程序,我需要遵循哪些常规事项才能使我的工具具有相同的类型?

使用*nix工具的主要原则是

假设我开始创建一个*nix样式的工具,将输入转换为大写。这是一个微不足道的例子,但这让我可以在这里发布整个程序

以下是源代码:

using System;
using System.Diagnostics.Contracts;

namespace Upperc {
  class Program {
    static void Main(string[] args) {
      var input = Console.ReadLine();
      Contract.Assert(input != null);

      Console.WriteLine(input.ToUpperInvariant());
    }
  }
}
我利用了
Console
方法处理输入和输出以及标准流这一事实。示例用法是:

> type example.txt | Upperc.exe > uppercased.txt
输入文件为纯文本文件:

example text file before processing
和输出文件:

EXAMPLE TEXT FILE BEFORE PROCESSING
“只做一件事”肯定是一个,但还有更多:

  • 只做一件事,把它做好
  • 成功时不输出任何内容(当然,除了结果)
  • 输入使用stdin,输出使用stdout,错误使用stderr
  • 使用非零退出代码传达故障
  • 考虑到这一点,在我看来,这是一个在C#中更“unixy”“to uppercase”的程序:

    使用系统;
    班级计划
    {
    静态int Main(字符串[]args)
    {
    尝试
    {
    var buf=新字符[4096];
    while(true)
    {
    int read=控制台In.read(buf,0,buf.Length);
    如果(读==0)
    打破
    for(int i=0;i

    与典型的unixy程序一样,您可以在不带参数的情况下运行它,然后它将是交互式的,允许您在控制台上手动键入输入,以Ctrl+Z终止,并在收到输入块时打印输出。或者,您可以将一个文件传递给它进行处理:
    uppercase.exe一个用途,并将其做好。为什么不使用cygwin?你想创建什么样的程序?或者你只是在问,你一般想遵循什么样的原则?
    
    using System;
    
    class Program
    {
        static int Main(string[] args)
        {
            try
            {
                var buf = new char[4096];
                while (true)
                {
                    int read = Console.In.Read(buf, 0, buf.Length);
                    if (read == 0)
                        break;
                    for (int i = 0; i < read; i++)
                        buf[i] = char.ToUpper(buf[i]);
                    Console.Out.Write(buf, 0, read);
                }
                return 0;
            }
            catch (Exception e)
            {
                Console.Error.WriteLine("ERROR: " + e.Message);
                return 1;
            }
        }
    }