return语句和Enviroment.ExitCode返回值的区别

时间:2015-06-11 11:47:47

标签: c#

我正在玩控制台的返回值,我看到了一些有趣的东西。有什么不同之处:

static void Main(string[] args)
{
    Environment.ExitCode = 4;
}

static int Main(string[] args)
{
    return 10;
}

如果我同时使用两者:

static int Main(string[] args)
{
    Environment.ExitCode = 4;
    return 10;
}

然后退出代码:
在命令行中它总是:10,
在视觉工作室它是:4,
从视觉工作室与残疾人主持过程是:10。

问题:
这两种设置退出代码的方法有哪些不同,哪种方法被认为是最有用的?

3 个答案:

答案 0 :(得分:1)

Environment.ExitCode州的文档:

  

如果Main方法返回void,则可以使用此属性来设置   退出代码将返回到调用环境。如果主要   如果不返回void,则忽略此属性。的初始值   这个属性为零。

因此,在您的情况下,您的<?php foreach(): ?> ------ // for each i_id <?php if(obj == 'obj_1'): ?> // WE NEED obj_1 VALUES FOR CHOICE BOLD COLOR <?php if(value_1 > value_2): ?> <?php $name_1_BOLD = "style='color: black;'" ?> <?php else: ?> <?php $name_2_BOLD = "style='color: black;'" ?> <?php endif; ?> <?php endif; ?> <div <?php echo $name_1_BOLD; ?>> // ------ here can be bold color <?php echo $name_1; ?> --------- // here pass NAME 1 </div> <div> <?php foreach(): ?> // ------ all values for each i_id <div> <?php echo $value_1.' - '.$value_2; ?> // here pass ALL VALUES FOR unique i_id </div> <?php endforeach; ?> </div> <div <?php echo $name_2_BOLD; ?>> // ------ here can be bold color <?php echo $name_2; ?> --------- // here pass NAME 2 </div> 会返回main,这意味着int不应该被使用(文档说明它将被忽略)。如果您的Environment.ExitCode返回main,而void似乎会按预期行事。

当您使用Environment.ExitCode Environment.ExitCode方法时,使用调试器运行时可能会产生奇怪的结果?

答案 1 :(得分:1)

为了回应&#34; vshost.exe&#34;在这种情况下。

vshost.exe进程使用Assembly.ExecuteAssembly()启动原始可执行文件,而ExecuteAssembly依次是documented到&#34;程序集入口点返回的值。&#34;

但是,vshost.exe可执行文件的(生成的)Main方法并不返回int,而是void。也就是说,它会忽略 class VsHost { public static int Main(string[] args) { // ... return appDomain.ExecuteAssembly("true.exe", ...); } } 返回的值。

例如,它看起来不像/概念上那样:

  class VsHost
  {
      public static void Main(string[] args) {
           // ...
           appDomain.ExecuteAssembly("true.exe", ...);
           // Nothing here...
      }
  }

但看起来像这样:

Environment.ExitCode

因此,基本上,当它退出时,唯一设置的退出代码是由ExitCode在&#34;真实&#34;中提供的退出代码。可执行文件。请注意, // Compile to "Example3.exe" using System; class Example3 { public static int Main(string[] args) { Environment.ExitCode = 4; return 5; } } // Complile to "VsHostMock.exe" using System; class VsHostMock { public static void Main(string[] args) { var appDomain = AppDomain.CreateDomain("other"); int returnCode = appDomain.ExecuteAssembly("Example3.exe"); Console.WriteLine("ReturnCode: {0}", returnCode); Console.WriteLine("Environment.ExitCode: {0}", Environment.ExitCode); } } 是全局值,与其设置的AppDomain无关。

您可以使用第三个示例和以下&#34; vshost-mock&#34;轻松测试此行为:

   C:\> VsHostMock.exe ; echo %ERRORLEVEL%
   ReturnCode: 5
   Environment.ExitCode: 4

然后运行以下命令:

   C:\> echo %ERRORLEVEL%
   4

然后运行:

string time="9.30 pm";
TimeSpan ts = DateTime.ParseExact(time, "h.mm tt", CultureInfo.InvariantCulture).TimeOfDay;

db.time = Timespan.Parse(ts);
context.modal.Add(db);
context.SaveChanges();

答案 2 :(得分:0)

根据微软的说法:

  

如果Main方法返回void,则可以使用此属性来设置   退出代码将返回到调用环境。如果主要   如果不返回void,则忽略此属性。的初始值   这个属性为零。

参考https://msdn.microsoft.com/en-us/library/system.environment.exitcode%28v=vs.110%29.aspx

我个人更喜欢使用return中的Main,但我想像往常一样,选择完全取决于你。