为什么C#使用隐式void Main?

13

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

所以我的问题是:

  1. 为什么Visual Studio将Main声明为void类型?
  2. 一旦C#控制台应用程序执行完毕,返回值给操作系统的最佳方法是什么?
8个回答

16

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

也许默认情况下是void,以免困惑初学者。


5
默认情况下,Main() 方法是空的,因为在 Windows 应用程序中通常不需要从 Main() 返回任何内容(这个返回代码是来自 DOS 的遗留物)。 - Pop Catalin

12

在 C# 中,你可以使用 MSDN 参考文档:

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

你也可以用两种方式返回(int)值。

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

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


2
回答者似乎是在提到你可以做什么,而不是标准。 - marr75

7

它并非隐式void。也就是说,你不能仅仅声明main(String[] args) 并将其编译为一个void函数。默认项目将main()声明为void是因为默认项目从main函数中没有任何有用的返回值。

值得注意的是,C#不同于C或C++。尽管语法有些相似,但差异之大远远超出了其相似之处。


6
我不确定C#开发者为什么决定将Main声明为void。至于在应用程序完成后向操作系统返回值,您可以使用以下代码:
System.Environment.ExitCode = 1; // Or whatever number other than 0 for errors.

3

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


2
你可以将它更改为任何你喜欢的吗?或者只有 intvoid 是可选项? - Philip Potter
在某些情况下,C和C++也可以这样说(一些编译器曾认为void main是有效的)。在C#中有标准的声明主函数的方式吗? - IVlad

2

最佳的返回退出值的方法是使用Exit函数。我这么说是因为非零的退出码通常用于表示某些错误,通常是你不希望继续执行的错误。使用非零退出值调用Exit函数既可以通过该值发出错误信号,又可以退出程序。

Environment.Exit( value );

编辑:请注意,我的声明是在控制台程序的Main中提出的。库和其他方法应该抛出异常或返回错误值。只有您的主要例程(Main)才应调用Exit。如果没有表达清楚,我很抱歉。


1
-1:调用Environment.Exit()是最糟糕的goto语句,可以从程序中的任何地方跨越所有终止边界。 - Sam Harwell
你没有理解重点——Environment.Exit()是.NET的ABEND。当你想要以非零退出值异常地退出程序时,你会准确地调用它,因为继续超过那个点会很危险(或无意义)。这很像从函数中提前返回。我想不出任何情况下我会使用它,而不是创建一些虚假逻辑来让你到达程序的“结尾”。话虽如此,我只会在Main中使用它——你不希望你的库调用它,它们应该抛出异常。 - tvanfosson

2

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


0

你可以使用 Environment.Exit() 来终止程序并向操作系统返回一个整数代码。另外,你也可以设置 Environment.ExitCode,这个代码将在程序正常终止时返回给操作系统。


这种做法是否比仅声明Main为int并返回值更好?我猜是的,因为这样我们可以从任何其他函数退出程序并返回一个退出码。 - IVlad
@IVlad - 我不会说这是更好的做法,只是一种不同的方式。 - Eric Petroelje

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