静态void main()是否是C#中入口点函数所必需的,或者我们可以使用其他一些函数? 为什么main()是静态的?
答案 0 :(得分:17)
是的,它必须是Main
。它是静态的,因为否则CLR需要担心创建该类型的实例 - 这意味着您可能必须拥有无参数构造函数,即使您没有想要该类型的实例等等。为什么你希望强制它成为实例方法?
答案 1 :(得分:10)
是的,对于c#应用程序,Main()
必须是入口点。
原因是因为语言的设计者决定将其作为您的计划的切入点。他们也可以使用完全不同的方法来找到入口点,例如使用元数据,或为您实例化一个对象(这将需要一个无参数的构造函数)。命名为void main()
的另一个原因是它对来自其他语言的用户来说很直观。
答案 2 :(得分:4)
Static Void Main()是要在C#中创建的任何“可执行文件”( .EXE )的必要入口点。库(或.DLL)可以有其他入口点。
该方法是静态的,因为这是访问方法所必需的,而不需要要对象的实例。为了从应用程序外部调用方法(起始点),需要一个静态方法。
答案 3 :(得分:1)
所需的切入点实际上是:
static void Main(string[] args); // note capitalization and arguments
Main
必须是静态的原因是必须在调用其上的任何方法之前构造非静态对象。由于Main
是程序的入口点,谁将调用它的构造函数?
(是的,您可以让CLR要求具有Main
的类包含默认的无参数构造函数,并在全局启动期间使CLR调用该构造函数。但这是额外的工作,并且在实践中它更容易要求Main
是静态的。)
答案 4 :(得分:0)
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
答案 5 :(得分:0)
static int Main(string[] args)
是静态的,因为它减少了运行时才能开始执行程序的入口点之前需要运行的潜在步骤数(运行类的静态构造函数,运行类的静态Main ...与run类的静态构造函数,将类实例化到未定义的某个位置,先运行实例的构造函数,然后再运行实例的Main方法)。您必须编写样板代码以将this
存储到您可以使用的实例变量中(并可能使其避免超出引用范围,从而使其能够被垃圾回收),这也往往会增加参考计数,并且需要更多的内存和价格以获取不多的收益。
之所以将其命名为Main,是因为C#在设计上强烈地使人联想到Java,而Java使用的名称Main本身源于C和C ++的细微差别(有时就是这样!)。