namespace ConsoleApplication3
{
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);
}
}
}
这段代码到底是怎么执行的,入口是Main函数吗?为什么加断点直接过去了,没有跳到class A中去???
{
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);
}
}
}
这段代码到底是怎么执行的,入口是Main函数吗?为什么加断点直接过去了,没有跳到class A中去???
解决方案 »
- 关于线程问题!为什么关闭项目后这个线程还在啊!求解
- WCF后台怎么控制客户端访问用户数?
- 恳求指出程序错误
- GDI画线的清除
- C#生成xml
- 紧急求助!!!各位兄弟,我在读取一个我朋友做的web-form程序的时候碰到了:“此项目的默认web访问模式设置为文件共享,但是无法从路径
- 谁能给我一个支持ACCESS的分页查询SQL语句
- silverlight中listbox和数据库的绑定?
- C#中用HttpWebRequest类 连续post数据(测试发现,循环2-4次的时候,就不行了)!求助,在线等!
- winform的treeView问题!
- 请问xml反序列化的一个类成员设置问题
- 如何判断某行是否包含汉字
{
X=B.Y+1;
}
不会被执行
Console.WriteLine("X={0},Y={1}", A.X, B.Y);
这一行啊
我试过public static int X;
Console.WriteLine(X);
输出时0,但是
public static int Y=A.X+1;
Y是一个表达式啊
从这句话知道
先执行 static B(){},然后执行
static A()
{
X=B.Y+1;
}
因为Y=A.X+1; 因为static A()还在执行,x这时候是等于0的。所以,这时B.y=1;A.x=0;
执行完A()之后A.x=1;
再获取 B.Y: public static int Y=A.X+1;
所以这时候 Y=2
输出的确是(1,2)
http://www.35hunan.com/Portals/cgNs/News/20100122/News_5898.htm
看这个楼主
(用到一个类的时候是先对其静态变量初始化,然后调用他的静态构造函数)
(类的静态构造函数只在加载类的时候由系统调用一次且只此一次)
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
class A 构造函数也没调用