为什么大多数C#程序的主方法入口点是静态的?

38

为什么大多数C#程序中的主方法入口点是静态的?


这是一个很好的问题,可能没有真正令人满意的答案。许多东西在Main被调用之前运行,这包括你想要的任意数量的对象构造函数。但是,我认为如果Program对象的构造函数遇到内存不足异常,那么你的计算机正在经历一个非常糟糕的一天! - Jeffrey L Whitledge
5
因为你不想让 C++ 和 Java 程序员感到过于惊恐。 - zaratustra
8个回答

60
为了调用实例方法,您需要一个对象的实例。这意味着为了启动程序,CLR需要创建一个Program实例来调用方法Main。因此,在Main之前构造函数Program将运行,这违背了具有main方法的目的。

9
这意味着静态构造函数仍然会被调用? - Yuriy Faktorovich
3
@Yuriy,是的。在C#语言规范的第10.11节中,它被明确称为如此。我不知道为什么做出了这个决定(可能是CLR层面的强制要求)。 - JaredPar
2
拥有一个主函数的目的是为应用程序定义一个入口点。将入口点定义为框架调用new Program().Main(args)而不是静态调用并不会完全失去其目的。 - Pete Kirkham
2
原因是因为Java就是这样做的。在Java创建时,仍然认为许多工作可以省略对象。您可能会在没有堆(只有堆栈)的芯片上拥有JVM - 在那里他们不想(或无法)实例化单个类。当时,C#是Java的一个相当直接的副本,尽管自那时以来它已经添加了更多的增强功能,但由于C#无法在这种环境中运行,因此使用带有(args)参数的构造函数是可行的。 - Bill K
如果框架总是调用new Program().Main(args),而且根据定义,您无法控制该Program对象是什么或如何构建它,那么这真的有什么不同于Main是静态的吗?哪一个更简单、更合乎逻辑、更容易实现呢?为什么我希望语言来决定应该为我实例化什么类型的对象? - Lightness Races in Orbit
显示剩余4条评论

16

我会反过来思考这个问题。让Main成为实例方法的功能有什么强制性好处呢?增加功能是代价高昂的;如果没有强制性的好处,那么这个功能就不会被实现。

你有一个非常充分的理由,可以让Main成为实例方法吗?


4

从概念上讲,您只有一个静态实例。静态方法很好地映射到程序的单个起始点的习惯用语。语言设计者可以创建一个特殊的程序类来使用main方法,但选择创建一个单独的静态函数作为入口点。在某些层面上,这只是一种设计选择。


1

否则它将不得不创建一个对象,运行构造函数可能会导致负面影响。


1

否则你怎么能在主函数之前创建类实例呢?


3
和调用main方法一样,你不用管运行时在main方法之前所做的很多事情,比如加载类和创建对象。 - Pete Kirkham

0

静态方法可以在不创建实例的情况下执行。按照惯例,它们将main方法作为默认方法进行调用。


0

.NET runtime 调用 Main 方法。(注意:Main 方法也可以从其他地方调用,例如在 ExampleClass 的另一个方法中的 Main() 代码中。)static 关键字使该方法可在没有 ExampleClass 实例的情况下访问。因此,Main 方法是一个入口点,必须声明为静态。

否则,程序将需要一个实例,但任何实例都需要一个程序。

为了避免这种无法解决的循环依赖,使用 main 作为入口点。


参考资料:http://zh.wikipedia.org/wiki/C_Sharp


-3

对于每一个类的对象,都包含主方法、其他方法和变量,每个对象都有其自己的变量和方法的副本,但它们之间只有一个主类的副本,为了在多个对象之间复制一个副本,我们必须将主方法设为静态的。


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