【问题标题】:Purpose of using a Main method that explicitly returns an int使用显式返回 int 的 Main 方法的目的
【发布时间】:2017-01-11 14:39:56
【问题描述】:

在 C# 中,您可以为主要方法使用 4 种不同的方法签名:

static void Main(string[] args) {}

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

static void Main () {}

static int Main {return 0;}

在进一步研究 Main 时,该参考文献指出,即使您构造一个原型化为返回 void 的 Main() 方法,也会自动返回值 0。

话虽如此,你为什么要使用一个签名返回一个 int 的 Main 方法,如果它无论如何都会返回呢?我知道返回值保存在一个名为 %ERRORLEVEL% 的变量中,并且您可以使用批处理文件捕获此代码,我只是好奇总是提供返回值。谢谢。

【问题讨论】:

  • 返回值可以在另一个应用程序中使用。这是在批处理文件中运行并需要报告错误的文件的标准行为。
  • 当您的应用程序被用作命令行实用程序时很有用,如果应用程序失败,您可以返回 -1 。一个示例自动数据库部署实用程序,它读取一些 sql 文件并将它们执行到目标服务器。好处是您可以在构建/部署工具中添加实用程序,如果失败,它们将出错。

标签: c# oop


【解决方案1】:

他们叫Exit codes

它是您的程序返回的状态或执行代码。现在它有点遗留,但一般来说,它是为了让调用者知道执行的过程。

零通常意味着成功执行。

就像代码中的函数向其调用者返回一个值一样,您的程序也应该向其调用者返回一个值,如脚本或操作系统。

返回码是过去的遗物,但在某些情况下仍然使用,例如控制台应用程序,因为它简单且易于处理。

为什么要使用一个而不是另一个?

如果您无意返回错误代码,C# 已添加允许 void 的语法糖,因此您无需考虑返回任何内容。在大多数情况下,这很好。

但是,如果您正在开发一个控制台应用程序,并且您想让调用者处理您的代码的任何结果,那么返回代码是一种简单且标准化的方法。

static int Main(string[] args) { return 0; } // Everything went fine

static int Main(string[] args) { return -1; } // An error occured.

static int Main(string[] args) { return 2; } // Program completed, with warnings.

static void Main(string[] args) {  } // Just returns zero.

代码的含义取决于每个程序,并将记录在文档或类似文件中。

See this answer for how it can be used in bat files:

.bat 文件示例

@echo off
myprogram.exe
if errorlevel 1 (
   echo Failure Reason Given is %errorlevel%
   exit /b %errorlevel%
)

【讨论】:

    【解决方案2】:

    如果您依赖返回 0 的 void 语法,那么您的程序只会返回 0,按照惯例,这是成功执行的状态码。对于许多用例,这可能没问题,但允许您的 main 方法显式返回一个 int 的关键是您可以在不同的情况下返回 不同的 个 int。对于非平凡的应用程序,如果您在有意义的上下文中手动返回不同的 int 值,那么您将从该功能中获得比在所有终止场景中盲目返回 0 更多的价值。

    此外,您似乎在问,如果两者都将返回整数,为什么您应该明确表示 static int Main 而不是 static void Main。除了上面关于返回有意义值的注释之外,更广泛地说,如果你希望你的方法返回一个整数,那么使用显式语法而不是依赖回退行为是有意义的,因为这样做后者对于修改或使用您的程序的其他人可能是未知的或不直观的。换个角度看你的问题——如果你想让你的 main 方法返回一个 int,为什么 不会 使用语法来明确地这样做? void 方法返回 int 有意义吗?

    【讨论】:

    • 这就是我要找的。不错!
    【解决方案3】:

    返回值为errorlevel,可以在批处理文件中使用errorlevel。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      相关资源
      最近更新 更多