日期:2014-05-17  浏览次数:20806 次

解释解释这段代码结果为什么是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);
  } 
}

产生的输出结果是x=1,,y=2 我觉的应该x=2,y=1
如果新建一个类 class C,放主方法
 static void Main(){  
  Console.WriteLine("X={0},Y={1}",A.X,B.Y);
 }
 结果就是 
x=2,y=1

为什么?????????????高手

------解决方案--------------------
类B入口函数,Y=A.X+1;首先执行类A的静态构造函数,static A,X=0+1,所以X=1;产生的输出结果是x=1,y=2

百度静态构造函数。
------解决方案--------------------
因为程序要执行
static void Main(){
所以就要先执行
static B(){}
而在这之前,需要先执行
public static int Y=A.X+1;
这时候开始执行
static A()
这时候
B.Y还是0呢,因为给Y赋值的操作没完成呢。


------解决方案--------------------
你只需要明白一个道理就可以知道答案了:
静态类加载-->初始化静态字段或属性-->调用静态构造函数,由始至终只会按照这个顺序初始化一次。(第一次使用前初始化)

你上面的程序在B类里面直接输出,所以B类先初始化,但是在初始化B类的字段的时候,调用了A,这个时候A初始化。也就是说真正先完成初始化的是A类。

执行A类构造函数的时候B.Y字段还没初始化完成,所以A.X=1。
执行B类构造函数的时候,A.X已经是1了。所以B.Y=2;

用C类去调用的时候先调用A的静态构造函数,在这个构造函数中调用了B.Y(B.Y先初始化完成)。


说起来稍微有点费劲,
参考MSDN:静态类和静态类成员(C# 编程指南)