【问题标题】:Why is the main method entry point in most C# programs static?为什么大多数 C# 程序中的 main 方法入口点是静态的?
【发布时间】:2011-01-22 22:37:43
【问题描述】:

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

【问题讨论】:

  • 这是一个很好的问题,可能没有真正令人满意的答案。很多事情在 Main 被调用之前运行,这些可以包含任意数量的对象构造函数。但是,我仍然认为,如果 Program 对象的构造函数出现内存不足异常,那么您的计算机将有一个真的糟糕的一天!
  • 因为你不想太吓唬 C++ 和 Java 程序员。

标签: c# language-implementation


【解决方案1】:

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

【讨论】:

  • 但这意味着静态构造函数仍然被调用?
  • @Yuriy,是的。在 C# 语言规范的第 10.11 节中特别提到了它。我不知道为什么会做出这个决定(可能是从 CLR 级别强制执行的)
  • 拥有 main 的目的是为应用程序定义一个入口点。将入口点定义为让框架调用 new Program().Main(args) 而不是静态调用根本不会破坏目的。
  • 原因是因为java就是这样做的。在创建 Java 时,仍然假设对于许多工作可以放弃对象。您可能在没有堆(只是堆栈)的芯片上有一个 JVM——他们不想(或不能)实例化单个类。 C# 在当时是 Java 的一个非常直接的副本,尽管此后它添加了更多增强功能,但由于 C# 无法在这样的环境中运行,因此使用带有 (args) 作为参数的构造函数是合理的。跨度>
  • 开发人员可能没有想到 Program() 可以具有主要功能。
【解决方案2】:

我会把问题转过来。实现允许 Main 成为实例方法的功能有什么引人注目的好处?功能很昂贵;如果没有令人信服的好处,它们就不会得到实施。

您是否有充分的理由允许 Main 成为实例方法?

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      因为否则它必须创建一个对象,并且运行构造函数可能会导致负面影响。

      【讨论】:

        【解决方案5】:

        否则你怎么能在 main 之前创建你的类实例?

        【讨论】:

        • 和你调用main的方式一样。你没有 - 运行时在 main 之前做了很多事情,加载类和创建对象。
        【解决方案6】:

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

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

        为了避免无法解决的 circular dependency main 被用作入口点


        参考:http://en.wikipedia.org/wiki/C_Sharp_(programming_language

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            对于一个类的每个对象都包含主方法和其他方法和变量,所有对象包含的每个变量和方法都有单独的副本,但是主类副本只是它们之间的一个副本,因此要在多个对象之间进行复制我们必须将 main 方法设为静态对象。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-04-21
              • 1970-01-01
              • 1970-01-01
              • 2017-07-05
              • 2018-11-22
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多