using System;
class A
{
public static int X;
static A()
{
X = B.Y + 1;
}
}
class B
{
public static int Y = A.X + 1;
static B() { }
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.X, B.Y);
Console.Read();
}
}请详细说明静态构造函数的执行顺序,然后具体说明输出时候的顺序,然后说明为什么输出第一个的时候调用B.Y当时Y并没有值,它是怎么运行的!谢谢!一定要详细!!
class A
{
public static int X;
static A()
{
X = B.Y + 1;
}
}
class B
{
public static int Y = A.X + 1;
static B() { }
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.X, B.Y);
Console.Read();
}
}请详细说明静态构造函数的执行顺序,然后具体说明输出时候的顺序,然后说明为什么输出第一个的时候调用B.Y当时Y并没有值,它是怎么运行的!谢谢!一定要详细!!
解决方案 »
- SnmpSharpNet walk问题,做过网管的进来看看
- 问个DataGridView的问题
- C#+OpengGL+3ds
- system 不存在类型或空间名称 windows 是什么原因?
- 为什么这句正确的SQL语句放到C#里边就什么都搜索不到呢?
- 怎么样才可以把大家吸引过来问个问题(的确是蛋贴,后添加分。。。靠每日40分来攒到100分,,,,,现在是穷光蛋了)
- =====郁闷的一个小问题======。
- C# 怎么解开JAVA 3DES加密后的数据
- activereports为什么在报表中只显示一页,而打印时却有两页
- 请问那里有GDI+的教程下载
- JS动态赋值的问题!
- c# windows应用程序查询mdb数据的问题
然后执行A的构造函数
在执行A的构造函数的时候
由于X = B.Y + 1; 这个地方有B的实例
B的构造函数会被调用
int 型 不赋值
也默认的有初始的值0
也就是说 执行B的构造函数的时候A.x的值是0
所以B.Y=1
然后A。X的值就是2了
不赋值 就是0
X=1,Y=2顺序
X = B.Y + 1; //此时B.Y = 0int Y = A.X + 1; //A.X = 1
为什么呢?
因为执行的时候,首先从程序的入口点(就是Main())找起,因为Main在类B中,所以从B类开始加载。执行顺序大致是这样的:
(用到一个类的时候是先对其静态变量初始化,然后调用他的静态构造函数)
(类的静态构造函数只在加载类的时候由系统调用一次且只此一次)
1.初始化B类的静态变量 Y,系统先给他一个默认值(此处是0),然后再执行他的初始化赋值语句public static int Y = A.X + 1;
2.执行这条语句的时候因为用到了A.X,所以遇到A的时候去加载类A,顺序一样,先是执行A的静态变量X的初始化工作public static int X;因为没有对其赋值的操作,所以X就是系统给他的默认值0;然后调用A的静态构造函数(B那里也是先初始化静态变量,然后才调用静态构造函数,因为B初始化静态变量的时候用到了A所以才会跳到A来,不然的话B那边也是初始化静态变量之后系统紧接着就会调用B的静态构造函数);
3,A的静态构造函数中执行X = B.Y + 1;可以知道,此时B.Y已经有了一个系统给他的默认值0,所以此处就是X=0+1;现在X就是1了
4,X那边都完工了,回到刚才跳转X的地方继续执行,就是继续执行Y = A.X + 1;毫无疑问此时是Y=1+1;至此,B的静态变量初始化完成了。
5,B的静态变量初始化完成了那紧接着就是系统调用B的静态构造函数,此处什么也不执行。
6.输出结果1,2
int Y = A.X + 1; //此处用到A,所以去掉用A的static构造函数static A()
{
X = B.Y + 1; //B.Y = 0,类filed member 没赋值的话,默认值 0
}Y = A.X + 1; //A.X = 1static B() { }