最小,良好的公民,C#控制台应用程序样板

Ati*_*ziz 23 c# command-line

什么是C#控制台应用程序入口点的最小样板代码,使其成为一个行为良好的公民?

当有人使用Visual Studio 创建一个控制台应用程序项目时(在撰写本文时最多到2008年),您将Program.cs看到一个如下所示的样板:

class Program
{
    static void Main(string[] args)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

有,但是,每个人都需要做的,使一个控制台应用程序中的几件事情微创好公民.例如,如果发生异常,则将清除消息写入标准错误(Console.Error)而不是标准输出(Console.Out).同样,如果发生某些错误,请将错误代码设置为非零值,以便调用进程可以检测到失败.

什么是C#控制台应用程序入口点的最小样板代码,使其成为一个行为良好的公民?您将添加或更改以下内容?

using System;
using System.Diagnostics;
using System.Linq;

static class Program
{
    static void Run(string[] args)
    {
        // TODO Replace line-echoing sample with actual application code

        string line;
        while ((line = Console.ReadLine()) != null)
            Console.WriteLine(line);
    }

    static int Main(string[] args)
    {
        // TODO Use a more robust arguments parser
        if (args.Any(arg => arg.Equals("/v") || arg.Equals("-v"))) // verbose?
            Trace.Listeners.Add(new ConsoleTraceListener(true));

        try
        {
            Run(args);
            return Environment.ExitCode;
        }
        catch (Exception e)
        {
            Console.Error.WriteLine(e.Message);
            Trace.TraceError(e.ToString());

            return Environment.ExitCode != 0
                 ? Environment.ExitCode : 100;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个样板实现了什么:

  • 如果抛出异常:
    • 打印到标准错误的干净消息
    • 跟踪完整的详细信息
    • 除非已设置,否则退出代码将设置为任意非零值(100)
  • 可以通过详细的开关动态打开跟踪
  • 跟踪被发送到标准错误,不会干扰实际输出
  • 成功完成后,退出代码反映最后一个Environment.ExitCode值,该值通常为零,但可以通过下游代码更改
  • Program class是静态的

这个问题的非目标:

  • 识别处理代码或库的命令行参数
  • 标识外部日志记录或跟踪库

dri*_*kin 7

我认为一切都取决于该应用的实际要求.如果没有要求进行自定义错误处理 - 请不要这样做.如果没有程序需要检查您的应用程序的退出代码 - 无需返回它; 我相信有些情况不适用这些要求.

换句话说,最小化是最小的; 做最可能有效的事情.如果你的应用程序满足要求,我想我们可以称之为良好的行为.


Gav*_*ler 3

对我来说,我希望看到Run(args)被类的实例化所取代。就像是:

主要尝试:

try
{
    // Process args to get parameters for AClass
    AClass program = new AClass(a, b);
    return program.Run();
}
Run Code Online (Sandbox Code Playgroud)

一类:

public class AClass {
    AClass(string a, string b) { ... }
    public int Run() {
        ...
        return Environment.ExitCode;
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样的事情会阻止程序代码并鼓励创建面向对象的方法。

关于AClass()构造函数,我认为参数应该在传递之前进行处理,AClass()而不必AClass()知道它是通过控制台应用程序创建的。