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



这个问题是关于在.NET中设计像普通Unix工具一样的控制台应用程序。Unix工具的基本基础是它们可以与1个工具链接在一起,能够从任何兼容stream获取输入并将输出提供给任何兼容stream

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

"

只做一件事"绝对是其中之一,但还有更多:

  1. 只做一件事,做好
  2. 成功时不输出任何内容(当然,结果除外)
  3. 使用
  4. stdin 表示输入,使用 stdout 表示输出,使用 stderr表示错误
  5. 使用非零退出代码传达故障

考虑到这一点,在我看来,这是 C# 中一个更"统一"的"大写"程序:

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;
        }
    }
}

像典型的 unixy 程序一样,您可以在没有参数的情况下运行它,然后它将是交互式的,允许您在控制台上手动键入输入,以 Ctrl+Z 终止,每当它收到您的输入块时打印输出。或者,您可以将文件传递给它以处理:uppercase.exe <input.txt,它将输出打印到控制台。或者您也可以将输出重定向到文件。或者,您可以将输入通过管道导入其中。等。

*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

相关内容

最新更新