【问题标题】:Why does C# use implicit void Main?为什么 C# 使用隐式 void Main?
【发布时间】:2010-03-02 15:11:42
【问题描述】:

我不明白为什么 C# 的 Main 函数在默认情况下是无效的(例如在控制台项目中)。在 C 和 C++ 中,标准明确规定 main 必须返回 int,并且使用返回值是有意义的,因为我们可以检查来自外部程序的返回值,并查看 C/C++ 应用程序是成功完成还是遇到错误。

所以我的问题是:

  1. 为什么 Visual Studio 将 Main 声明为 void?
  2. 在 C# 控制台应用程序完成执行后,向操作系统返回值的最佳方式是什么?

【问题讨论】:

    标签: c# .net standards


    【解决方案1】:

    您可以使用 intvoid 作为返回类型。因此,只需更改它并返回一个类似 C++ 的值。

    为了不让初学者感到困惑,可能默认情况下它是无效的。

    【讨论】:

    • 默认情况下它是无效的,因为您通常不需要在 win 应用程序中从 Main() 返回任何内容(返回代码是 dos 的遗留代码)
    【解决方案2】:

    在 C# 中,您可以使用 see MSDN

     static int Main() 
     static int Main(string[] args)
     static void Main() 
     static void Main(string[] args)
    

    您还可以通过 2 种方式返回 (int) 值。

    在控制台应用程序中,我会使用int Main() { ...; return 2; }

    在 WinForms/WPF/... 应用程序中,在极少数情况下它需要返回值,我会使用
    Environment.ExitCode = 1;Environment.Exit(1);

    【讨论】:

    • 回答者似乎指的是你能做什么,而不是标准。
    【解决方案3】:

    它不是隐含的无效。如中,您不能只声明 main(String[] args) 并将其编译为 void 函数。默认项目将 main() 声明为 void,因为默认项目没有任何有用的东西可以从 main 返回。

    还值得注意的是,C# 不是 C 或 C++。有些语法是相同的,但差异要大得多。

    【讨论】:

      【解决方案4】:

      C# 的开发人员决定将 Main 声明为 void 的原因我不能说。至于在应用程序完成后将值返回给操作系统,您可以使用:

      System.Environment.ExitCode = 1; // Or whatever number other than 0 for errors.
      

      【讨论】:

        【解决方案5】:

        您可以更改 Main 的返回类型而不会造成任何问题。

        【讨论】:

        • 你能把它改成你喜欢的任何东西吗?还是intvoid 是唯一的选择?
        • 好吧,在某些情况下,C 和 C++ 也是如此(在某些时候,void main 被某些编译器认为是有效的)。是否有在 C# 中声明 Main 的标准方法?
        【解决方案6】:

        请记住,您的程序周围还有另一个“盒子”——CLR。当您的代码抛出未处理的异常时,它将返回错误代码。

        【讨论】:

          【解决方案7】:

          返回退出值的最佳方式是使用。我这样说是因为非零退出代码通常用于表示某些错误,通常是您不想继续的错误。使用非零退出值调用 Exit 都会通过该值发出错误信号并退出程序。

          Environment.Exit( value );
          

          编辑:请注意,我的语句的上下文在控制台程序的Main 内。库和其他方法应该抛出异常或返回错误值。只有您的主程序应该调用Exit。对不起,如果这不清楚。

          【讨论】:

          • -1:调用Environment.Exit() 是最糟糕的goto 语句——从程序中的任何地方,跨越所有边界直到终止。
          • 你没有抓住重点——Environment.Exit() 是.NET 的ABEND。当您想以非零退出值异常退出程序时,您准确地调用它,正是因为继续超出该点将是危险的(或无意义的)。这很像一个函数的早期返回。我想不出任何我会使用它的情况,通过创建一些虚假的逻辑来让你到达程序的“结束”会更好。也就是说,我只会在 Main 中使用它——你不希望你的库调用它,它们应该抛出异常。
          【解决方案8】:

          您可以使用Environment.Exit() 终止并向操作系统返回一个整数代码。或者,您可以设置Environment.ExitCode,只要您的程序正常终止,该代码就会返回给操作系统。

          【讨论】:

          • 这是否被认为比简单地将 Main 声明为 int 并返回一个值更好?我猜是这样,因为这样我们可以使用任何其他函数的退出代码退出程序。
          • @IVlad - 我不会说这真的是一种更好的做法,只是一种不同的做法。
          猜你喜欢
          • 2018-03-16
          • 2011-03-10
          • 2010-10-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-14
          • 2015-05-23
          • 2012-03-15
          • 1970-01-01
          相关资源
          最近更新 更多