何时应使用Environment.Exit终止控制台应用程序?

43

我在工作中维护了一些控制台应用程序,其中我注意到它们中的许多都调用了Environment.Exit(0)。

一个示例程序看起来像这样:

public class Program
{
    public static void Main(string[] args)
    {
        DoStuff();
        Environment.Exit(0);
    }
}

我不明白原始程序员这样做的意图是什么?在我的看法中,即使没有Environment.Exit语句,程序也应该正常退出。尽管如此,在其中一个程序中,控制台窗口一直保持着开启状态,即使它应该已经关闭了,所以我真的不确定发生了什么....

我在这里有所遗漏吗?或者在这种情况下调用Environment.Exit是否有道理?


6
很多这些东西都是程序员的迷信,比如关闭和处理连接对象,即使它被包装在 using 语句中。 - Matthew Lock
2
@MatthewLock 某些外部进程或脚本可能会检查退出代码,以查看可执行文件是否没有出现任何错误。这就是为什么在退出时返回0是一个好习惯。例如,从NodeJS / Electron调用命令行应用程序就是其中的一个例子。因此,并非所有程序员的迷信。 - HK1
7个回答

63
只有在可能有其他前台线程运行时,才需要将Exit()作为Main函数的最后一行调用。如果执行到末尾就中止Main,则它们将继续运行。即使在这种情况下,通常最好在其他线程中放置一些明确的优雅终止-或从一开始就将它们设置为后台线程。
如果您想从Main返回不同的退出代码,则更简单的方法是声明它返回int类型。
简而言之,我认为在这里您不需要使用Environment.Exit(),值得问问您的同事他们为什么使用它-很可能他们无法给出一个好的理由,这是可以省略的。

谢谢Jon!我想我不会有太多的好运去问原开发者,因为她正在产假。至少我现在知道我可以删除它而不用担心破坏什么。 - mezoid
链接的问题https://dev59.com/w2435IYBdhLWcg3wuign还提供了有用的信息。 - Bjørn Otto Vasbotten

16

基本上,语句Environment.Exit(0)向操作系统表明这是一个“干净”的退出。还有其他数字,每个数字都有不同的含义,例如Environment.Exit(1)

但需要注意的一点是,“Main”声明为不返回任何内容的“void”,因此退出代码实际上并没有意义。

如果您想了解更多有关不同退出代码的信息,请参阅此处:

系统错误代码(0-499)


5
Main 被声明为不返回任何内容与退出代码的含义无关。 - Ry-

2

这是为命令行程序向底层 shell 表示成功或失败而设计的(兼容性),并且继承自较早的 C 风格的主循环,其中 main 函数的原型为

int main(void);

int main(int argc, char *argv[]);

传统上,返回值为0意味着成功,而非零则表示失败或其他情况,具体取决于程序员的决定。

参考资料


在我的情况下,我的控制台应用程序是一个独立的应用程序,不需要告诉操作系统任何东西。所以我想这意味着在我的情况下这个调用是多余的……? - mezoid
这更多是告诉 shell 程序你的程序是否成功或失败,这可能在以后很重要,所以遵循惯例。例如批处理文件、nAnt 集成、安装程序等。 - Robert Paulson
2
值得注意的是,.NET控制台应用程序的主方法也可以返回intvoid。我经常这样做。 - tomfanning

0
SSIS 中,当您有一个“执行进程任务”并且想要知道进程是否失败时,此方法非常有用。

“if process is failure”是什么意思?你是指“如果进程失败了”吗?还是指“进程以失败代码退出”(不同于0)?或者是其他什么意思? - Peter Mortensen

0

当其他应用程序正在等待您的控制台应用程序的结果时,这确实非常有用。例如,SQL Server Reporting Services(SSRS)(工具)可以启动控制台应用程序并等待返回成功或失败响应。Environment.Exit(0)会发送回一个成功执行的消息。


0

我目前在控制台应用程序中使用Environment.Exit(),我不想将丑陋的异常文本返回到控制台。相反,我只是注意到条件,向屏幕写入用户友好的消息,然后调用Environment.Exit()

否则,在基本控制台应用程序中,您不需要从Main()调用它。


0

.NET Core中,目前必须使用Environment.Exit来终止Mac上的程序。仅从main返回不会停止进程,它会一直运行,直到用户中止它。类似以下模式:

public class Program
{
    public static void Main(string[] args)
    {
        Environment.Exit(TryRun(args));
    }
}

在我的工作场所中,使用通用代码是很常见的,因为我们希望能够同时发布 Windows 和 Mac 版本。


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