C#题目,大家帮忙看下,很急

chen0683102 2011-04-15 10:32:58
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中去???
...全文
144 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen0683102 2011-04-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 peter200694013 的回复:]
因为执行的时候,首先从程序的入口点(就是Main())找起,因为Main在类B中,所以从B类开始加载。执行顺序大致是这样的:
(用到一个类的时候是先对其静态变量初始化,然后调用他的静态构造函数)
(类的静态构造函数只在加载类的时候由系统调用一次且只此一次)
1.初始化B类的静态变量 Y,系统先给他一个默认值(此处是0),然后再执行他的初始化赋值语句public static int Y = ……
[/Quote]
感谢,你讲的很详细
zhang120300 2011-04-15
  • 打赏
  • 举报
回复
上楼都解释了。
Peter200694013 2011-04-15
  • 打赏
  • 举报
回复
因为执行的时候,首先从程序的入口点(就是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
jianshao810 2011-04-15
  • 打赏
  • 举报
回复
静态构造函数是C#的一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。
从这句话知道
先执行 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
看这个楼主

chen0683102 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hitlcyu19 的回复:]
执行的顺序是这样的,因为static是类似全局的变量,所以它是要先执行的,而这里B中有Main,所以先执行B,B中有Y,Y=A.x+1,进入A,X=B.Y+1,默认Y=0,所以X=1,返回,所以Y=2,进入Main,打印结果。
[/Quote]
貌似有点道理,但为什么Y默认是0呢。
我试过public static int X;
Console.WriteLine(X);
输出时0,但是
public static int Y=A.X+1;
Y是一个表达式啊
chen0683102 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fk1984316 的回复:]
你断点加在哪了?
最后输出是1,2啊
[/Quote]
断点加在
Console.WriteLine("X={0},Y={1}", A.X, B.Y);
这一行啊
hitlcyu19 2011-04-15
  • 打赏
  • 举报
回复
执行的顺序是这样的,因为static是类似全局的变量,所以它是要先执行的,而这里B中有Main,所以先执行B,B中有Y,Y=A.x+1,进入A,X=B.Y+1,默认Y=0,所以X=1,返回,所以Y=2,进入Main,打印结果。
fk1984316 2011-04-15
  • 打赏
  • 举报
回复
你断点加在哪了?
最后输出是1,2啊
CAINIAOXIANGFEI 2011-04-15
  • 打赏
  • 举报
回复
入口是Main函数。当然不会跳到class A中去了 public static的作用就是分配在静态空间上的。相当于C++中的全局变量。输出结果应该是X=0,Y=1static A()
{
X=B.Y+1;
}
不会被执行
w_f_y4422 2011-04-15
  • 打赏
  • 举报
回复
简单地说,触发断点要有操作,Main函数只调用了静态变量,当然进不了class A
class A 构造函数也没调用
村长_乐 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 peter200694013 的回复:]

因为执行的时候,首先从程序的入口点(就是Main())找起,因为Main在类B中,所以从B类开始加载。执行顺序大致是这样的:
(用到一个类的时候是先对其静态变量初始化,然后调用他的静态构造函数)
(类的静态构造函数只在加载类的时候由系统调用一次且只此一次)
1.初始化B类的静态变量 Y,系统先给他一个默认值(此处是0),然后再执行他的初始化赋值语句public static int Y =……
[/Quote]
+
qizhihao2010 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jianshao810 的回复:]
静态构造函数是C#的一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。
从这句话知道
先执行 static B(){},然后执行
static A()
{
X=B.Y+1;
}
因为Y=A.X+1……
[/Quote]
+1

110,552

社区成员

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

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

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