为什么要主要是静态的?
我试图在C#中创buildpublic void Main()
它说没有静态无效主要发现 。
Main
是静态的意味着什么? 我知道public static void Main()
的代码工作正常。
但为什么Main
必须是static
?
你需要一个入口点进入你的程序。 静态意味着你可以调用这个函数,而不必实例化一个类的对象/实例。 它有点“鸡和蛋”…你不能在程序中实例化一个对象。
可以调用静态方法而不实例化对象。 因此,main()需要是静态的,以使它成为你的程序的入口。
正如大卫说,你可以添加关键字static
到函数定义来改变它。 它值得研究静态(类)方法vs实例方法,并知道它们之间的差异有时可能是有用的。
只有静态的main方法可以完成这个工作,因为有一个约定定义了这个行为。 没有其他原因。
看看C#语言规范 :
当执行环境调用一个被称为应用程序入口点的指定方法时,就会启动应用程序启动。 该入口点方法总是被命名为Main,并且应该具有以下签名之一:
static void Main(){…}
static void Main(string [] args){…}
static int Main(){…}
static int Main(string [] args){…}如图所示,入口点可以select返回一个int值。 该返回值用于应用程序终止(第10.2节)。
除此之外, Main
这个名字可以改成别的东西。 在这种情况下,必须添加一个编译器选项,告诉C#编译器将不同的方法标记为程序的入口点。
一个类中有两种types的方法:
- 非静态方法
- 静态方法
// Example of static and non-static methods and how to call namespace TestStaticVoidMain { class Program { Static Void Main(string[] args) { // Instantiate or create object of the non-static method: Exam ob = new Exam(); // Call the instance: ob.Test1(); // Directly the call the static method by its class: Exam.Test2(); Console.ReadKey(); } } class Exam { public void Test1() { Console.WriteLine("This is a non-static method"); } public static void Test2() { Console.WriteLine("This is a static method"); } } }
1.静态方法:
要调用静态方法(函数),我们不需要实例化或创build该方法的一个对象。 我们不能使用new
关键字,因为当类加载和编译时, static
关键字默认实例化或创build该类方法的对象,所以我们直接调用静态方法。
在引用static void Main(string[] args)
,我们已经讨论过static
。 余数是void Main(string[] args)
。 void
是不返回任何内容的数据types。 Main()
是执行C#程序的标准入口点。 可选参数string[] args
接收程序运行的可选“命令行”参数。
2.非静态方法:
要调用非静态方法,我们必须实例化或创build类方法的对象,以使用关键字new
来调用类的方法(函数)。
如果一个名为Test
的类有一个名为show()
的非静态方法,那么它将如何调用一个实例:
// to call non-static method Test ob=new Test(); ob.show();
从概念上讲,框架可以指定不是使用特定的静态方法来运行程序,而是构build一些特定类的默认实例,并在其上运行一些特定的方法。 如果有一个框架通过使它们成为编译器初始化的单例实例的实例成员来实现静态方法,这种方法可能是完全合理的,因为在任何情况下调用main函数之前,框架都必须生成一个新的对象实例。
但是,如果调用一个静态方法比构造一个新的对象实例并调用一个方法更“容易”,那么要求框架使用更昂贵的行为方式并没有多大好处。 任何想要使用后一种方法的代码都可以完全自由地使用:
public static void Main( [[params]] ) { var mainObject = new MainObject(); mainObject.Main( [[params]] ); }
系统包含自己的静态方法可能会带来一些潜在的好处:
public static void SysMain( [[params]] ) { using (Application app = new UserApp( [[params]] )) // UserApp derives from Application { app.Start(); // Virtual method app.AllowNext(); // Base method--see text app.Run(); // Abstract method } }
其中app.AllowNext()
是一种与基本同时启动的其他应用程序实例协调的方法,以确保在后台启动应用程序的重复尝试将严格按顺序处理它们的Start
调用。 然而,如果没有这样的协调scheme,要求框架在运行之前先构造一个应用程序对象并没有什么好处。 成本不会很大,但是如果没有任何潜在的可识别的利益,那么即使是一个微不足道的成本也没有多less意义。
静态成员的作用范围是类级别(而不是对象级别),因此可以在不需要首先创build新的类实例的情况下调用它们。 一个主要的方法是静态的,因为它可以在程序启动时运行,因为它是运行的程序的入口点,而不创build类的一个实例。
换句话说,静态函数在类被实例化之前存在,所以静态被应用到主入口点(Main方法)。