什么是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)
这个样板实现了什么:
Program
class是静态的这个问题的非目标:
我认为一切都取决于该应用的实际要求.如果没有要求进行自定义错误处理 - 请不要这样做.如果没有程序需要检查您的应用程序的退出代码 - 无需返回它; 我相信有些情况不适用这些要求.
换句话说,最小化是最小的; 做最可能有效的事情.如果你的应用程序满足要求,我想我们可以称之为良好的行为.
对我来说,我希望看到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()
知道它是通过控制台应用程序创建的。