日期:2014-05-18  浏览次数:20863 次

.net面试题
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);
}
}
产生的输出结果是什么?
x=1,y=2


这题考的主要目的是要考什么的?static修饰的东西是不是可以直接调用,不用再NEW了再调用?求大家帮助~~~~

------解决方案--------------------
static 分配的变量,一经声明,其内存地址是不会再改变了,直到其生命期结束
所以后面对该变量所做的修改,都将反应在同一个对象上面

static B() 静态构造函数,当且仅当首次访问该类型时被调用,只会调用一次
------解决方案--------------------
这个主要是考察类加载时候的顺序
B类main函数作为入口,首先就会加载B类,这个时候用到了A类的属性,加载A类,又用到B类的属性,而这个时候B类中的Y还没有初始化完毕,但其作为类的成员,会有个默认值(0),故A.Y = 1,返回刚才的B类,B类中继续B.Y 的初始化 = 1 + 1 = 2;
------解决方案--------------------
还有一个关键
Main函数放在class B里面的。
所以class B 先被初始化。

如果把Main函数放到另外一个独立的类 如 program的话。
A先初始化。因为Console.WriteLine("X={0},Y={1}",A.X,B.Y)是从左到右处理的

------解决方案--------------------
我为我当前的两个答案抱歉···我把2个类复制成单独的类了·····

using System;
class A
{
public static int X;
static A(){
X=B.Y+1; }第二步是这里: x=0+1;在返回去b类。。。就是y=1+1
}
class B
{
public static int Y=A.X+1; 第一步运行这里 ,然后马上跳到A类
static B(){}
static void Main(){
Console.WriteLine("X={0},Y={1}",A.X,B.Y); 最后输出就是 最后输出的结果就是x=1 y=2
}
}
跑出的结果是x=1.y=2;