在C#中,退出控制台应用程序的命令是什么?

338

在C#中退出控制台应用程序的命令是什么?


2
这个回答解决了你的问题吗?如何在.NET中指定控制台应用程序的退出代码? - Michael Freidgeim
关于使用 *Trace.Assert()*(通常是有条件的)退出以及其退出代码(在某些平台上为134),请参见此处 - Peter Mortensen
4个回答

476
你可以使用Environment.Exit(0);Application.ExitEnvironment.Exit(0) 更加清晰。

13
只是好奇,什么让它更干净? - Grant H.
当我通过https://dev59.com/wXVC5IYBdhLWcg3wykQt#7865126向控制台应用程序添加计时器时,这对我非常有效。即使使用https://dev59.com/2XI-5IYBdhLWcg3w18V3#37029044,Application.Exit也无法实现。 - Jason Anderson
7
@GrantH. 之所以更加清晰,是因为它给底层操作系统提供了更有用的错误代码,说明程序为何退出。 - Fayssal El Mofatiche
然而,Environment.Exit 要求您拥有 SecurityPermissionFlag.UnmanagedCode 权限 - 这可能会对某些人造成麻烦。 - wp78de

100

按照适当性顺序,有以下几种选择:

  1. 从 Program.Main 方法返回 int 值。
  2. 抛出异常并不在任何地方处理它(用于意外错误情况)。
  3. 为了强制在其他地方终止,使用 System.Environment.Exit(不可移植!请参见下文)。

编辑于 2013 年 9 月以改善可读性

返回特定的退出代码:正如 Servy 在评论中指出的那样,您可以使用带有 int 返回类型的 Main 声明,从而通过这种方式返回错误代码。因此,除非需要使用 Exit 终止并且无法在 Main 方法中完成,否则实际上没有必要使用 Environment.Exit。如果任何未处理的异常传播到 Main 中,则可以通过抛出异常并在 Main 中返回错误代码来避免使用它们。如果应用程序是多线程的,则可能需要更多的样板代码才能正确地终止并返回退出代码,因此最好直接调用 Environment.Exit。

另一个不使用 Evironment.Exit 的原因 - 即使编写多线程的应用程序 - 是可重用性。如果您想要在使 Environment.Exit 无关紧要的环境中重复使用代码(例如可能在 Web 服务器中使用的库),则该代码将不可移植。在我看来,最好的解决方案仍然是始终使用异常和/或返回值来表示方法达到某些错误/完成状态。这样,您可以在任何 .NET 环境中以及任何类型的应用程序中始终使用相同的代码。如果您正在编写特定需要返回退出代码或以类似于 Environment.Exit 的方式终止的应用程序,则可以继续封装线程并根据需要处理错误/异常。


13
最后这个选项很不恰当。没有程序员愿意通过抛出异常来退出一个程序。 - Nikhil Agrawal
5
正如我所写的“按最合适的顺序”。此外,在某些情况下,抛出异常是正确的方式(例如当发生意外、致命的错误且应用程序永远无法恢复时)。我已经更新答案以阐明。 - sinelaw
如果你在Main函数中,只需返回0、1等整数,并将方法签名标记为返回int类型的错误代码即可,不需要使用Environment.Exit指定错误代码。 - Servy
2
取决于调用堆栈的深度以及是否在主线程中。调用Environment.Exit可能比构建整个程序并在不使用异常解开调用堆栈的情况下返回到主函数更简单(在后台线程中则无法工作;无论是线程池会吞噬异常还是将其抛出未处理,无论哪种方式,主方法或线程中的任何捕获逻辑都永远无法看到它)。 - KeithS
我改变了选项的顺序。抛出异常的优点是使您的代码在不同的可执行环境中更容易作为库进行重用。 - sinelaw
应该提到,返回一个整数意味着你要在所有代码路径上返回...所以只需在Main方法的末尾添加return 1,并在你想要“提前退出”的部分添加return 0 - undefined

29

当主函数运行结束时,控制台应用程序将退出。使用“return”语句即可实现此目的。

    static void Main(string[] args)
    {
        while (true)
        {
            Console.WriteLine("I'm running!");
            return; //This will exit the console application's running thread
        }
    }

如果你要返回一个错误代码,可以按照以下方式实现,这种方式可以从初始线程之外的函数中访问:

    System.Environment.Exit(-1);

为什么是负数? - Peter Mortensen
负值表示调用过程中出现错误。这向调用应用程序发出信号,表明它是一个错误而不是成功运行。返回0或正整数表示成功。https://www.tutorialspoint.com/batch_script/batch_script_return_code.htm - Developer

11
你可以使用 Environment.Exit(0)Application.ExitEnvironment.Exit():终止此进程并将指定的退出代码传递给底层操作系统。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接