【问题标题】:C# entry point functionC#入口点函数
【发布时间】:2011-05-10 18:09:58
【问题描述】:

在C#中是否需要使用static void main()作为入口函数,或者我们可以使用其他函数吗? 为什么main() 是静态的?

【问题讨论】:

标签: c#


【解决方案1】:

从 C# 9 开始,您现在可以通过 顶级语句 删除样板。

之前:

using System;

    namespace HelloWorld
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
            }
        }
    }

新可能:

using System;

Console.WriteLine("Hello World!");

来源:https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9#top-level-statements

如果您坚持使用Main函数作为入口点,可以找到更多信息here

【讨论】:

    【解决方案2】:

    在 C# 9 之前,必须显式声明入口点。 C# 9 引入了top level statements,它允许隐式生成入口点。 (但是,项目中只有一个源文件可以包含顶级语句。)

    当显式声明入口点时,它必须是Main。它是静态的,因为否则 CLR 需要担心创建该类型的实例 - 这意味着您可能必须有一个无参数构造函数,即使您不想要该类型的实例等等。你为什么想要强制它成为一个实例方法?

    即使使用顶级语句,您的实际程序仍然有一个名为 Main 的入口点 - 它只是不会出现在您的源代码中。

    【讨论】:

    • @anish,因为它必须是某种东西,而且 Public Static Void Quack() 听起来不太好。既然有一扇门,为什么还要穿过墙呢?
    • @Cos Main() 是否特定于 CLR?
    • @Anish。 CLR 指定必须有一个入口点,C# 语言规范将入口点标识为 Main()。 VB.Net 也使用 main(),但它不区分大小写。其他语言可能会指定不同的入口点,但我不知道有一种使用“main”或“Main”以外的东西。
    • @juleagon:这将是一个合理的选择,我不知道为什么要坚持使用知名名称,尽管这确实意味着您不需要编写 Hello World了解属性...
    • @julealgon:老实说,这对我来说感觉相当务实。这么说吧:在我写 C# 的这段时间里,它真的没有给我带来任何痛苦。
    【解决方案3】:

    static void Main() 是在 C# 中创建的任何“可执行文件”(.EXE)的必要入口点。库(或 .DLL)可以有其他入口点。

    该方法是静态的,因为这是在没有要寻址的对象实例的情况下访问该方法所必需的。为了从应用程序外部调用方法(起点),需要一个静态方法。

    【讨论】:

    • 什么是标记图书馆入口点的好习惯?可能有几个公共类,如何向用户显示哪个是关键?命名空间?与 dll 名称对应的类的名称?
    【解决方案4】:

    是的,对于 C# 应用程序,Main() 必须是入口点。

    原因是语言的设计者决定寻找什么作为程序的入口点。他们也可以使用完全不同的方法来找到入口点,例如使用元数据,或者为你实例化一个对象(这需要一个无参数的构造函数)。将其命名为 void main() 的另一个原因是它对于来自其他语言的用户来说很直观。

    【讨论】:

      【解决方案5】:

      需要的入口点其实是:

      static void Main(string[] args); // note capitalization and arguments
      

      Main 必须是静态的原因是必须先构造非静态对象,然后才能调用它们的任何方法。既然Main是程序的入口点,谁来调用它的构造函数呢?

      (是的,您可以让 CLR 要求具有 Main 的类包含默认的无参数构造函数,并在全局启动期间让 CLR 调用该构造函数。但这是额外的工作,实际上只需要它更容易Main 是静态的。)

      【讨论】:

      • 所需的入口点其实...非常灵活。您可以从中返回一个 int 并且可以省略参数
      • 如果我们这样做Public void Main(string[] args),然后通过从应用程序外部创建它的实例来调用它,那不是工作吗?
      【解决方案6】:

      Main 方法可能是您认为的应用程序的入口点,但据我所知,在 c# 中方法不能直接在命名空间中定义,这意味着它必须在一个类中。那么真正的第一个执行的东西是包含Main方法的类的静态构造函数

      using System;
      namespace test
      {
          class Program
          {
              static Program()
              {
                  Console.WriteLine("static constructor");
              }
      
              public static void Main(string[] args)
              {
                  Console.WriteLine("Main method");
              }
          }
      }
      

      先输出static constructor,然后输出Main method

      【讨论】:

        【解决方案7】:

        static int Main(string[] args) 是静态的,因为它减少了运行时在开始执行程序入口点之前需要经过的潜在步骤的数量(运行类的静态构造函数、运行类的静态 Main... 与运行类的静态构造函数,将类实例化到某个未定义的位置,运行实例的构造函数,然后运行实例的 Main 方法)。您必须编写样板代码来将 this 存储到您可以使用的实例变量中(并且可能会防止它超出引用范围,从而使其能够被垃圾收集),这也往往会增加引用计算并需要更多的内存和价格,但收益不大。

        之所以命名为 Main,是因为 C# 在其设计中让人想起 Java,而 Java 使用 Main 这个名称,它本身源于与 C 和 C++ 的细微差别(大小写是一回事!)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-17
          • 1970-01-01
          • 2011-07-13
          • 2019-01-25
          • 2020-01-06
          • 1970-01-01
          • 2013-12-09
          相关资源
          最近更新 更多