当前位置:编程学习 > C#/ASP.NET >>

大家帮我看看这个题的结果为什么是x=1,y=2

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);
}
}
产生的输出结果是什么?

希望能解答的清楚一些。
--------------------编程问答-------------------- 晕晕晕。。这是什么折磨人的题目啊? --------------------编程问答-------------------- 这不是很多公司的笔试题么??在VS看下他们的执行顺序就知道怎么回事了! --------------------编程问答-------------------- 我靠  什么东西啊 和程序一点关系都没有 --------------------编程问答-------------------- static void Main(){ 先从主函数开始 -->X={0}, a.x-->类a的属性X=B.Y+1; 
static B(){} 所以b.y=0; x=0+1;-->Y={1}",Y=A.X+1; 因为A.x=1 so  Y=2

--------------------编程问答-------------------- b类的main函数是程序的入口点
先构造b类对象
构造期间执行语句Y=A.X+1涉及到a类对象
转而去构造a类对象
构造期间执行语句X=B.Y+1
此时b.y为默认值0(Y=A.X+1尚未执行完毕)
所以a.x为0+1=1
所以b.y为1+1=2

又因为静态构造函数只在第一次涉及到某个类的时候执行且只执行一次
所以在WriteLine语句中a.x不会再去执行X=B.Y+1而变为3 仍然为第一次所赋的值1 同理b.y仍然为2

有说错的地方请指正 --------------------编程问答-------------------- 关键点:静态构造函数只执行一次,静态成员在初始化就确定了,答案为:A.X = 2,B.Y = 1
PS:首先计算A.X的时候执行静态构造函数B.Y+1。函数里要求确定B.Y的值,A.X+1.但是现在的A.X取值时不会执行静态构造函数,所以现在的A.X=0,所以现在时刻的B.Y = 1,A的静态构造函数执行完毕后。A.X = 2,同时在执行A的构造函数的时候B.Y的值已经确定。B.Y=1,所以B.Y始终是1,而不会是2+1=3 --------------------编程问答--------------------
引用 4 楼 tkascor 的回复:
static void Main(){ 先从主函数开始 -->X={0}, a.x-->类a的属性X=B.Y+1; 
static B(){} 所以b.y=0; x=0+1;-->Y={1}",Y=A.X+1; 因为A.x=1 so  Y=2 


我觉得是先有的b类才会有b类中的main方法 
所以b类的构造在前
main函数的执行在后
main函数中WriteLine的值是已经构造好的 而不是在WriteLine时才构造的

我这样理解正确否? --------------------编程问答--------------------
引用 6 楼 gangzai 的回复:
关键点:静态构造函数只执行一次,静态成员在初始化就确定了,答案为:A.X = 2,B.Y = 1 
PS:首先计算A.X的时候执行静态构造函数B.Y+1。函数里要求确定B.Y的值,A.X+1.但是现在的A.X取值时不会执行静态构造函数,所以现在的A.X=0,所以现在时刻的B.Y = 1,A的静态构造函数执行完毕后。A.X = 2,同时在执行A的构造函数的时候B.Y的值已经确定。B.Y=1,所以B.Y始终是1,而不会是2+1=3


兄弟 反了吧?! 
程序最先构造的是b类对象 而不是a类
在构造b类的过程中涉及到了a类 才去构造的a类 --------------------编程问答-------------------- 楼上正解,我也这样想它的执行顺序,注意:Y=A.X+1 不是 Y=X+1
所以它要执行
static A()
执行后得到X值才是Y=A.X+1
所用的X值


--------------------编程问答--------------------
引用 5 楼 hubblebubblepig 的回复:
b类的main函数是程序的入口点 
先构造b类对象 
构造期间执行语句Y=A.X+1涉及到a类对象 
转而去构造a类对象 
构造期间执行语句X=B.Y+1 
此时b.y为默认值0(Y=A.X+1尚未执行完毕) 所以a.x为0+1=1 
所以b.y为1+1=2 

又因为静态构造函数只在第一次涉及到某个类的时候执行且只执行一次 
所以在WriteLine语句中a.x不会再去执行X=B.Y+1而变为3 仍然为第一次所赋的值1 同理b.y仍然为2 

有说错的地方请指正

你是对滴
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,