日期:2014-05-19  浏览次数:21262 次

静态类初始化原理(里面有代码可以复制粘贴),顶者有分
using   System;
using   System.Collections.Generic;
using   System.Text;

namespace   ConsoleApplication1
{

        static   class   A
        {
                public   static   int   a   =   B.b   +   1;
                static   A()
                {
                        Console.WriteLine( "Static   A() ");
                }
        }
        static   class   B
        {
                public   static   int   b   =   A.a   +   1;
                static   B()
                {
                        Console.WriteLine( "Static   B() ");
                }


        }
        class   C
        {  
                        static   void   Main(string[]   args)
                {
                        Console.WriteLine( "A.a={0},B.b={1} ",A.a,B.b);
                        Console.ReadLine();
                }
        }
}

将main方法分别放在A,B,C类中的时候,输出结果不同,为什么?


------解决方案--------------------
同时,程序的执行都是以堆栈方式
比如,你把main函数方到B class的时候,程序的执行顺序是这样:
因为是在B里,所以,先初始化B的静态变量,所以就先去初始化b,这时就会访问A.a,
这样就会初始化A Class,这时的B.b的状态是空间已经被分配了,但是还没有初始化,因此这个值有可能呢和编译器,以及编译方式不同而不同,一般来说,debug方式,这时的B.b应该是0
这样A.a就是1,然后执行A的静态构造函数
A这边完了,才是B
------解决方案--------------------
解释一下nicochang() 的意思,
当Main()在C中时,Console.WriteLine( "A.a={0},B.b={1} ",A.a,B.b); 首先访问A,A被创建后初始化内部成员a,
因为public static int a = B.b + 1;
A在初始化的时候访问了B,所以这里会导致B被创建,同样B被创建后初始化内部成员b,这时A已经被成功创建,且A.a有默认值0,所以B.b被初始化为1,之后调用静态构造函数。
程序指针返回,继续初始化A.a,则A.a=2,然后调用static A();

当Main()在A中时,会导致程序一进来就访问了A,根据上面的顺序,会先完成初始化B,后完成初始化A。Main()在B中也是一个意思。

可能说得有点乱,在成员定义处和静态构造函数处加断点调一下就明白了。