C#中Main函数为何要static

假设没有static关键字,那意味着须要用生成一个实例后才能够调用这个Main方法,而Main方法是程序入口点,你没有进入Main方法,天然没法生成一个实例,既然没有实例,那就没法调用Main函数,岂不矛盾?因此Main函数被设置为static.   Main()函数在C#里很是特殊,它是编译器规定的全部可执行程序的入口点。因为其特殊性,对Main()函数咱们有如下几条准则:   Main()函数必须封装在类或结构里来提供可执行程序的入口点。C#采用了彻底的面向对象的编程方式,C#中不能够有像C++那样的全局函数。   Main()函数必须为静态函数(static)。这容许C#没必要建立实例对象便可运行程序。   Main()函数保护级别没有特殊要求, public,protected,private等均可,但通常咱们都指定其为public。   Main()函数名的第一个字母要大写,不然将不具备入口点的语义。C#是大小写敏感的语言。   Main()函数的参数只有两种参数形式:无参数和string 数组表示的命令行参数,即static   void Main()或static void Main(string[]args) ,后者接受命令行参数。一个C#程序中只能有一个Main()函数入口点。其余形式的参数不具备入口点语义,C#不推荐经过其余参数形式重载Main()函数,这会引发编译警告。   Main()函数返回值只能为void(无类型)或int(整数类型)。其余形式的返回值不具备入口点语义。   在C#中,static变量表示该变量属于类,而不是类的实例。"static"修饰符声明一个静态元素,而该元素属于类型自己而不是指定的对象,能够说是该类的全部实例共享一个static变量。   看看什么是 static class 吧,刚开始我就为不能声明一个 abstract sealed class   而苦恼不已,abstract 和 sealed一块儿用?定义abstract的目的就是抽象基类,seal表示不能继承的实体类,彻底是两回事,怎么可能一块儿用呢?abstract代表必需要被继承,sealed代表不能够被继承,这两个是矛盾的,怎么能够一块儿用呢。   经过查看 IL 代码,咱们会发现 static class 实际上就是 abstract sealed class,   只不过编译器在编译时顺便对 static class 的成员修饰符进行检查而已。让咱们再来猜想一下 MS 开发人员的想法:他们的目的是想得到 abstract sealed class 的效果,但却为语义上的矛盾而苦恼不已,你们想得到一个优美的解决方式,因而就为 C 2.0 新增了一个 static 关键字,完美的解决了这个问题。   也许有人会问:为何不是 static class = abstract class + static member limit   而要加上 sealed 的限制呢?理由是继承一个只有 static 成员的类和从新写一个类完   全没有区别。为何这么说呢?由于 static 必然是not virtual,继承它又能有什么   用呢?   static class 还有一个限制,那就是只能从 System.Object 继承,为何会有这个限   制,理由和上面差很少。   往往提到 static 关键字,我就想起了 static constructor,感谢 MS 的开发人员提   供了这么好的一个特性。可是 C 提供了 static constructor 却没有提供static destructor,不过在 Applied Microsoft .NET Framework Programming 一书中   Jeffery Richter 给咱们提供了一个办法就是经过 System.AppDomain.DomainUnload   事件去达到一样的效果。使用 static constructor 要注意的就是这里抛出任何异常都会致使该类型在从新加载AppDoamin 以前再也不可用,因此要加倍当心,另外 static contructor 中很容易有两个类型死锁的状况发生,在编写代码的时候必定要想清楚。   const与 readonly的区别 const==static readonly   const 的概念就是一个包含不能修改的值的变量。   常数表达式是在编译时可被彻底计算的表达式。所以不能从一个变量中提取的值来初始化常量。若是 const int a = b+1;b是一个变量,显然不能再编译时就计算出结果,因此常量是不能够用变量来初始化的。   readonly 容许把一个字段设置成常量,但能够执行一些运算,能够肯定它的初始值。   由于 readonly 是在计算时执行的,固然它能够用某些变量初始化。   readonly 是实例成员,因此不一样的实例能够有不一样的常量值,这使readonly更灵活。   readonly 关键字与 const 关键字不一样。   1. const 字段只能在该字段的声明中初始化。   readonly 字段能够在声明或构造函数中初始化。所以,根据所使用的构造函数,readonly 字段可能具备不一样的值。   2. const 字段是编译时常数,而 readonly 字段可用于运行时常数。   3. const 默认就是静态的,而 readonly 若是设置成静态的就必须显示声明。   4.const 对于引用类型的常数,可能的值只能是 string 和 null。   readonly能够是任何类型   ----------------------------   非静态成员又称实例成员,必须做用于实例。在程序刚开始运行的时候,未创建任何实例,所以没法调用实例成员,包括非静态的Main方法。为了可以在程序的开始执行Main方法,必须将其声明为静态。   顺便说明,在Main方法中调用的成员也必须是静态的,除非创建过相应的实例。   例如:   namespace lover_P.Test {   public class Test {   public void InstanceMethod() {} // 实例成员(非静态)   public static void StaticMethod {} // 类型成员(静态)   public static void Main() {   InstanceMethod(); // 错误!调用了实例成员,而此时并无创建实例   StaticMethod(); // 正确!能够调用静态成员   Test SomeTest = new Test(); // 创建本类型的一个实例   SomeTest.InstanceMethod(); // 再在这个实例上调用实例成员就对了   SomeTest.StaticMethod(); // 附加一句,在实例上调用静态成员也是错误的!   }   }   } 原文连接:http://net5x.blog.51cto.com/7900145/1568257%20
相关文章
相关标签/搜索