C# 入口点函数

本文关键字:函数 入口 | 更新日期: 2023-09-27 17:56:05

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

C# 入口点函数

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

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

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

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

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

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

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

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

以前:

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

新可能:

using System;
Console.WriteLine("Hello World!");

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

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

所需的入口点实际上是:

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

Main必须是静态的原因是,在对非静态对象调用任何方法之前,必须构造非静态对象。既然Main是程序的入口点,谁来称呼它的构造函数?

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

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

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

它之所以被命名为Main,是因为C#在设计中强烈地让人联想到Java,而Java使用Main这个名字,它本身就源于C和C++的轻微区别(大小写是一回事!)。