静态构造函数

 一:特点
    1:静态构造函数既没有访问修饰符,也没有参数。
    2:如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数。
    3:在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
    4:如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行。
    5:如果类中的静态字段带有初始化,则静态字段的初始化语句将在静态构造函数之前运行。
    6:一个类只能有一个静态构造函数。
    7:无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
    8:最多只运行一次。
    9:静态构造函数不可以被继承。

二 :需求
    1.为什么使用静态构造函数?
    类有一些静态字段和属性,需要在第一次使用类之前,从外部源中初始化这些静态字段和属性
    2.静态构造函数什么时候执行
    CLR不能确定静态构造函数什么时候执行,也不能预计不同类的静态构造函数按什么顺序执行,但可以明确的是,静态构造函数之多执行一次,即在引用类之前执行在C#中,静态构造函数通常在第一次调用类的成员之前执行
    3.静态构造函数有访问修饰符吗?
    没有。因为,C#代码从不调用它,但在加载类时,总是由,CLR调用它。对于C#来说是私有的吧
    4.静态构造函数可以有参数吗?
    不能有参数。
    5.一个类可以有多个静态构造函数吗?
    一个类只能有一个静态构造函数
    6.静态构造函数可以访问实例成员吗?
    显然不能。只能访问静态成员
    7.一个类可以同时拥有午餐的静态构造函数和实例构造函数吗?
    可以。因为,静态构造函数是在加载类时执行的,而实例构造函数是在创建实例时执行的,所以两者不会有冲突

三:示例
   

class A
     {
         public static int X;
         static A()             //④   执行完后返回到③  
         {
             X = B.Y + 1;
             Console.WriteLine("static   A()");
         }
     }

     class B
     {
         public static int Y = A.X + 1;       //③   调用了A的静态成员,  
         //     转到A的静态构造函数---->  
         static B()             //②   如果带有初始值设定项的静态字段,  
         //     执行该类的静态构造函数时,  
         //     先要按照文本顺序执行那些初始值设定项。  
         //     转到初始值设定项---->  
         {
             Console.WriteLine("static   B()");
         }
         static void Main()           //①   程序入口,  
         //     如果类中包含用来开始执行的   Main   方法,  
         //     该类的静态构造函数将在调用   Main   方法之前执行。  
         //     转到B的静态构造函数---->  
         {
             Console.WriteLine("X   =   {0},   Y   =   {1}", A.X, B.Y);//⑤   输出结果  
             Console.ReadLine();
         }
     } 
     执行结果:X=1;Y=2