菜鸟、小易——求助:谁能帮我解释下这个程序是怎么回事!问题解决,立马结贴!

xiaoyi_nuo 2010-08-04 05:26:18
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并没有值,它是怎么运行的!谢谢!一定要详细!!
...全文
174 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Peter200694013 2010-08-04
  • 打赏
  • 举报
回复
order:
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 = 1

static B() { }

跑跑鱼 2010-08-04
  • 打赏
  • 举报
回复
http://blog.sina.com.cn/s/blog_55100f7901000c6i.html
xiaoyi_nuo 2010-08-04
  • 打赏
  • 举报
回复
又是我自己在网上把答案搜到的,无语了……

大家都看看吧……

这个题目的答案是 1,2
为什么呢?
因为执行的时候,首先从程序的入口点(就是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
Peter200694013 2010-08-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 peter200694013 的回复:]
输出:
X=1,Y=2

顺序
X = B.Y + 1; //此时B.Y = 0

int Y = A.X + 1; //A.X = 1
[/Quote]
sorry,貌似说错了...少打了个断点...
ghost281536992 2010-08-04
  • 打赏
  • 举报
回复
是哪个公司的笔试题来着?
忘记了。。。。。。
Peter200694013 2010-08-04
  • 打赏
  • 举报
回复
输出:
X=1,Y=2

顺序
X = B.Y + 1; //此时B.Y = 0

int Y = A.X + 1; //A.X = 1
xiaoyi_nuo 2010-08-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 husanbo110 的回复:]
首先显然是main 函数
然后执行A的构造函数
在执行A的构造函数的时候
由于X = B.Y + 1; 这个地方有B的实例
B的构造函数会被调用
int 型 不赋值
也默认的有初始的值0
也就是说 执行B的构造函数的时候A.x的值是0
所以B.Y=1
然后A。X的值就是2了
[/Quote]


额,哥们,貌似结果是X=1,Y=2额……
husanbo110 2010-08-04
  • 打赏
  • 举报
回复
初始int 型
不赋值 就是0
husanbo110 2010-08-04
  • 打赏
  • 举报
回复
你把程序的开始 不点击执行
按F11就行
可以观察他怎么执行的
xiaoyi_nuo 2010-08-04
  • 打赏
  • 举报
回复
高手们额,我知道是先调用的B.Y,结果X=1,Y=2,输出顺序是从左到有,先输出X=1,后输出Y=2,我的问题的关键是为什么当调用B.Y的时候,B.Y会是0 ??????
husanbo110 2010-08-04
  • 打赏
  • 举报
回复
首先显然是main 函数
然后执行A的构造函数
在执行A的构造函数的时候
由于X = B.Y + 1; 这个地方有B的实例
B的构造函数会被调用
int 型 不赋值
也默认的有初始的值0
也就是说 执行B的构造函数的时候A.x的值是0
所以B.Y=1
然后A。X的值就是2了
Peter200694013 2010-08-04
  • 打赏
  • 举报
回复
先看看啊
w5223336 2010-08-04
  • 打赏
  • 举报
回复
打个断点 然后一直F11就行了
wiki14 2010-08-04
  • 打赏
  • 举报
回复
不用详细,你从程序开始切个断点就可以看的详细了。

110,578

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧