HOWTO · Csharp
在 C# 中退出控制台应用程序
在 C# 控制台应用程序中,通常从 Main 返回以正常结束程序;若需从其他方法立即终止进程,可调用 Environment.Exit(int) 并指定退出码。
本页内容
C# 控制台应用程序完成工作后,通常从 Main 返回。只有在需要从其他方法立即停止进程时,才使用 Environment.Exit()。从 Main 返回整数或将整数传给 Environment.Exit(int),都会提供进程退出码;控制台文本与退出码彼此独立。
从 Main 返回以结束应用程序
return 语句会结束当前方法。当它结束 Main 时,应用程序的正常执行也随之完成;return 后面的语句不会运行。从嵌套方法返回只会把控制权交还给调用方,本身不会结束应用程序。程序正常完成时,优先从 Main 返回,因为这符合常规控制流,也能让外围的 finally 块和资源清理逻辑运行。
void Main() 可以使用 return;,不返回值而结束。int Main() 可以返回退出码。下面的完整示例会打印状态信息,并返回约定俗成的成功码。提供的运行观察结果为 Work completed.,退出码为 0。
运行此示例:
本节中的代码以及显示的标签或输出仍为英文。
using System;
class Program
{
static int Main()
{
Console.WriteLine("Work completed.");
return 0;
}
}
Work completed.
return 0; 会结束 Main,操作系统或调用进程会收到 0。如果需要表示失败,可以改为返回非零码。每个非零值的确切含义由你的程序或调用方定义。
使用 Environment.Exit() 从任何方法终止进程
Environment.Exit(int) 可以从 Main 以外的方法终止进程。它会立即以指定的整数退出码结束进程,也不会返回给调用方。只有在无法采用正常的控制流展开时才使用它,例如确实需要立即关闭程序的情况;处理常规错误时,通常应报告问题并从 Main 返回合适的退出码。
下面的完整示例从 StopApplication 调用 Environment.Exit(0);该方法不是 Main:
本节中的代码以及显示的标签或输出仍为英文。
using System;
class Program
{
static void Main()
{
StopApplication();
Console.WriteLine("This line is not reached.");
}
static void StopApplication()
{
Console.WriteLine("Stopping now.");
Environment.Exit(0);
}
}
此调用提供退出码 0,并在 StopApplication 返回前终止进程,因此 Main 中的下一行不会执行。提供的运行观察结果针对上面的 Main 示例,并不涵盖此示例。像 Environment.Exit(1); 这样的调用则会提供退出码 1;这个整数会传给操作系统或调用进程,而通过 Console.WriteLine 打印的消息属于独立的控制台输出。该方法是 System.Environment 上的静态方法,因此使用 using System; 的文件可以直接调用它。
选择退出码并了解清理行为
按照惯例,使用 0 表示成功,使用非零值表示失败。这只是惯例,并非适用于所有应用程序的统一映射:如果脚本、服务管理器或其他调用方需要解读这些代码,请记录各代码的含义。从 Main 返回整数和调用 Environment.Exit(int) 都会传达进程退出码。退出码不会自动打印;如果需要向用户解释原因,请另行打印诊断信息。
程序可以正常完成时,优先从 Main 返回。方法正常返回时,控制流离开 try 语句会运行相应的 finally 块;using 声明等作用域资源也会在作用域结束时释放。Environment.Exit() 会立即停止进程,因此不会进行常规的调用栈展开;尚未执行的 finally 块和托管资源清理也会被跳过。使用立即终止前,应通过正常控制流刷新或关闭重要资源;如果清理对于保存数据或释放资源不可或缺,就应避免使用这种方式。
区分进程退出、循环跳出、异常与 Ctrl+C
break 语句会退出最近的循环或 switch,程序随后会继续执行该结构之后的语句。如果跳出循环后应该结束程序,就让执行流程到达 Main 的末尾,或在循环后从 Main 返回。
抛出异常会将控制权转交给匹配的处理程序。如果处理程序捕获了异常并继续执行,进程就没有退出。先处理相应情况;如果应用程序应该结束,再选择正常的返回路径和合适的退出码。未处理的异常可能会结束进程,但仅仅把异常当作快捷退出方式,会掩盖原本的控制流和错误处理意图。
Ctrl+C 是控制台发出的取消请求,并不保证程序会以优雅方式退出。程序可以通过 Console.CancelKeyPress 观察此请求;进程是立即停止,还是由处理程序取消默认响应,取决于事件处理方式和宿主环境。如果取消操作需要清理,请记录该请求,让主控制流停止当前工作并正常返回。