关于静态变量的初始化
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