我正在维护一些控制台应用程序,我在其中一些人注意到的一件事就是他们调用了Environment.Exit(0)。
示例程序如下所示:
public class Program
{
public static void Main(string[] args)
{
DoStuff();
Environment.Exit(0);
}
}
我不明白原始程序员的意图是什么?在我看来,即使没有Environment.Exit语句,程序应该退出就好了。也就是说,对于其中一个程序,它的控制台窗口即使在应该关闭之后仍然存在,所以我真的不确定那里发生了什么....
我在这里遗漏了什么吗?或者是否有理由在此实例中调用Environment.Exit?
答案 0 :(得分:53)
将Exit()
作为Main方法的最后一行调用的唯一原因是,是否可能有其他前台线程在运行。如果执行刚刚从Main
结束,它们将继续运行。即使在这种情况下,通常更好的做法是将一些明确的优雅终止放入其他线程 - 或者让它们以后台线程开始。
如果您想要从Main
返回不同的退出代码,更简单的方法是将其声明为返回int
。
简而言之,我认为你不需要Environment.Exit()
,并且值得向你的同事询问他们为什么使用它 - 他们很可能无法给你一个充分的理由,这是你可以削减的另一点点。
答案 1 :(得分:15)
基本上,语句Environment.Exit(0)
告诉操作系统这是一个“干净”的退出。还有其他数字,每个数字都有不同的含义,如Environment.Exit(1)
然而有一点需要注意的是,“Main”已被声明为不返回“void”,因此退出代码对它没有任何意义。
如果您想了解更多有关不同退出代码的信息,请点击此处
答案 2 :(得分:3)
这是命令行程序的[兼容性],用于指示底层shell的成功或失败,并且是从旧的C风格主循环继承的,其中主要函数的原型是
int main(void);
int main(int argc, char *argv[]);
0的返回值传统意味着成功,而非零意味着失败或其他东西,取决于程序员的决定。
参考:
wiki了解有关main
功能的更多信息。
Environment.Exit()
上的Environment.Exit():终止此过程并给出 底层操作系统 指定的退出代码。
答案 3 :(得分:0)
当其他应用程序等待您的控制台应用程序的结果时,会真正使用它。例如,SSRS(工具)可以启动控制台应用程序,并等待恢复成功的失败响应。 Environment.Exit(0)发回成功的执行消息。
答案 4 :(得分:0)
在SSIS中,如果您有执行流程任务并且想知道流程是否失败,则此方法很有用。
答案 5 :(得分:0)
到目前为止,在.net核心中,人们必须使用Environment.Exit
来终止Mac上的程序。从main
纯粹返回并不会停止该过程,它一直在运行,直到用户中止它为止。像这样的模式:
public class Program
{
public static void Main(string[] args)
{
Environment.Exit(TryRun(args));
}
}
在我的工作场所很常见,因为我们希望同时在Windows和Mac上发布。
答案 6 :(得分:0)
我目前正在控制台应用程序中使用=IFERROR(IFERROR(IF(MATCH(A24,'Sales Orders'!A:A,0),"On Pick",),IF(MATCH(A24,'Stock Reqs'!A:A,0),"On Pick",)),"")
,我不想在控制台应用程序中添加难看的异常文本。相反,我只是注意到情况,在屏幕上向用户写一条关于发生了什么的友好消息,然后调用Environment.Exit()
。
否则,您不需要在基本控制台应用程序中从Environment.Exit()
调用它。