静态类初始化原理(里面有代码可以复制粘贴),顶者有分
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中也是一个意思。
可能说得有点乱,在成员定义处和静态构造函数处加断点调一下就明白了。