日期:2014-05-20  浏览次数:20870 次

关于静态变量的初始化
    public class BB
    {
        public static int y = AA.x + 1;   
        //static BB(){}
    }
    public class AA
    {
        public static int x;
        static AA()
        {
            x = BB.y + 1;
        }    
    }

void Main()
{ Console.WriteLine("AA.x={0},BB.y={1}",AA.x,BB.y);   }
上面输入是x=1,y=2 而当BB添加空的静态构造函数时返回又是x=2,y=1
请教这两者的区别

------解决方案--------------------
第一种,先回初始化 AA.x和BB.y,此时都是0,当访问AA时,会调用AA的静态构造,里面又会访问BB,此时就会对BB.y+1,之后y=1,那么x=y+1=2

第二种,会先调用AA的构造,里面访问bB,然后int y = AA.x + 1,此时AA.x=0,所以y=1,然后调用BB的构造,之后返回AA()处,此时BB.y=1,那么x=1+1=2
------解决方案--------------------
说不好,
好像默认构造函数与自定义构造函数的执行顺序有些不一样啊
------解决方案--------------------
http://technet.microsoft.com/zh-cn/library/ms182346(v=vs.90)
如果所有静态数据是内联初始化的,且没有声明显式静态构造函数,则 C# 和 Visual Basic 编译器将向 MSIL 类定义添加 beforefieldinit 标志。编译器还会添加包含静态初始化代码的私有静态构造函数。该私有静态构造函数保证在访问类型的任何静态字段之前运行。

BB没有静态构造的时候,编译器优化代码后,在执行main()之前初始化B类
反之,则仅在第一次访问类型时初始化静态字段

在Debug和Release(优化代码)后,运行的结果也可能不同
------解决方案--------------------
http://www.cnblogs.com/end/archive/2010/06/23/1763634.html