【发布时间】:2011-05-10 18:09:58
【问题描述】:
在C#中是否需要使用static void main()作为入口函数,或者我们可以使用其他函数吗?
为什么main() 是静态的?
【问题讨论】:
标签: c#
在C#中是否需要使用static void main()作为入口函数,或者我们可以使用其他函数吗?
为什么main() 是静态的?
【问题讨论】:
标签: c#
从 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
【讨论】:
在 C# 9 之前,必须显式声明入口点。 C# 9 引入了top level statements,它允许隐式生成入口点。 (但是,项目中只有一个源文件可以包含顶级语句。)
当显式声明入口点时,它必须是Main。它是静态的,因为否则 CLR 需要担心创建该类型的实例 - 这意味着您可能必须有一个无参数构造函数,即使您不想要该类型的实例等等。你为什么想要强制它成为一个实例方法?
即使使用顶级语句,您的实际程序仍然有一个名为 Main 的入口点 - 它只是不会出现在您的源代码中。
【讨论】:
static void Main() 是在 C# 中创建的任何“可执行文件”(.EXE)的必要入口点。库(或 .DLL)可以有其他入口点。
该方法是静态的,因为这是在没有要寻址的对象实例的情况下访问该方法所必需的。为了从应用程序外部调用方法(起点),需要一个静态方法。
【讨论】:
是的,对于 C# 应用程序,Main() 必须是入口点。
原因是语言的设计者决定寻找什么作为程序的入口点。他们也可以使用完全不同的方法来找到入口点,例如使用元数据,或者为你实例化一个对象(这需要一个无参数的构造函数)。将其命名为 void main() 的另一个原因是它对于来自其他语言的用户来说很直观。
【讨论】:
需要的入口点其实是:
static void Main(string[] args); // note capitalization and arguments
Main 必须是静态的原因是必须先构造非静态对象,然后才能调用它们的任何方法。既然Main是程序的入口点,谁来调用它的构造函数呢?
(是的,您可以让 CLR 要求具有 Main 的类包含默认的无参数构造函数,并在全局启动期间让 CLR 调用该构造函数。但这是额外的工作,实际上只需要它更容易Main 是静态的。)
【讨论】:
Public void Main(string[] args),然后通过从应用程序外部创建它的实例来调用它,那不是工作吗?
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... 与运行类的静态构造函数,将类实例化到某个未定义的位置,运行实例的构造函数,然后运行实例的 Main 方法)。您必须编写样板代码来将 this 存储到您可以使用的实例变量中(并且可能会防止它超出引用范围,从而使其能够被垃圾收集),这也往往会增加引用计算并需要更多的内存和价格,但收益不大。
之所以命名为 Main,是因为 C# 在其设计中让人想起 Java,而 Java 使用 Main 这个名称,它本身源于与 C 和 C++ 的细微差别(大小写是一回事!)。
【讨论】: