此代码是msdn上的一个例子
搜索了一下csdn和一些blog也有关于这个例子的问题
都在寻求此段代码的思路 本人惭愧也没有理解
所以发出此贴 已求帮助!
****************************************************************
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
要执行 Main 方法,系统在运行类 B 的静态构造函数之前首先要运行 B.Y 的初始值设定项。因为引用了 A.X 的值,所以 Y 的初始值设定项导致运行 A 的静态构造函数。这样,A 的静态构造函数将继续计算 X 的值,从而获取 Y 的默认值 0,而 A.X 被初始化为 1。这样就完成了运行 A 的静态字段初始值设定项和静态构造函数的进程,控制返回到 Y 的初始值的计算,计算结果变为 2。以上文字是msdn对此段代码的说明,没有理解!
************************************************************************
以下是我的疑点
************************************
对于这个输出我有点疑问,在这段代码编译运行的时候,首先,由于class B里面带有Main,所以肯定是要先运行static B(),但是在class B()中又有静态的字段,所以会先执行Y = A.X + 1这行代码,到了这里的时候,由于A.X这句,所以在class A中,程序会先执行静态构造器,静态构造器中的代码X = B.Y + 1,这个时候该怎么往下执行了?请教一下

解决方案 »

  1.   

    B.Y的值为什么是0 
    不是定义了
    public static int Y = A.X + 1;
    X = B.Y + 1
    这两句互相引用 如何得出Y=0??????请讲讲运行的过程 结果都是勿庸置疑的
      

  2.   

    计算A.X时 B.Y还没有完全被赋值
      

  3.   

    对于这个输出我有点疑问,在这段代码编译运行的时候,首先,由于class B里面带有Main,所以肯定是要先运行static B(),但是在class B()中又有静态的字段,所以会先执行Y = A.X + 1这行代码,到了这里的时候(Y的初始值在内存中为0),由于A.X这句,所以在class A中,程序会先执行静态构造器,静态构造器中的代码X = B.Y + 1,(所以此时Y = 0)->X = 1
      

  4.   

    计算A.X时 B.Y还没有完全被赋值
     
    那B.Y被谁赋了0值呢?
    public static int X; 为什么此时X不是0呢?
      

  5.   

    Y 的初始值设定项导致运行 A 的静态构造函数。这样,A 的静态构造函数将继续计算 X 的值,从而获取 Y 的默认值 0,而 A.X 被初始化为 1。这样就完成了运行 A 的静态字段初始值设定项和静态构造函数的进程,控制返回到 Y 的初始值的计算,计算结果变为 2。
    ======================================================================
    你贴说明也讲的比较清楚了
      

  6.   

    值类型,.net框架会自动赋予初始值,Int 就是0
      

  7.   

    hdt(倦怠) ( ) 
    ======================================================================
    你贴说明也讲的比较清楚了
    X为什么不被赋予0值呢
      

  8.   

    值类型,.net框架会自动赋予初始值,Int 就是0对啊 X同样也是值类型
      

  9.   

    static A() {
          X = B.Y + 1;//在这句之前X也是0
       }
      

  10.   

    因为A的静态构造函数的关系,所以
    int Y = A.X+ 1 这时A.X 为1
      

  11.   

    所以 Y 的初始值设定项导致运行 A 的静态构造函数。这样,A 的静态构造函数将继续计算 
      

  12.   

    系统在运行类 B 的静态构造函数之前首先要运行 B.Y 的初始值设定项
      

  13.   

    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);
       }
    }可以改写成这样吗?
       public static int Y ;//这句可以理解值类型被分配初值0
       Y= A.X + 1;//这句又利用赋值语句为静态字段重新赋值
    所以说可以把原句分成两个步骤来理解是吗?
       public static int Y = A.X + 1;
      

  14.   

    实际上这段代码的执行顺序,可以这样理解:
    B.Y = 0;
    A.X = 0;
    A.X = B.Y + 1; //--此时B.Y = 0
    B.Y = A.X + 1; //--此时A.X = 1
      

  15.   

    B.Y和A.X是同时被赋予初值O吗?
    还是CLR先赋予B.Y
    后再赋予A.X呢
      

  16.   

    很简单,每一句语句前后加上 Console.WriteLine来看看变量的变化过程就知道了
      

  17.   

    X = B.Y + 1;
    这句还没有明白
    此时X的赋值需要Y这个字段 
    大家说了Y被默认赋值0
    但B类中有静态构造器
    调用了B的静态成员
    然后为什么没有转到B的静态构造函数
    而是取了B的0值呢?
      

  18.   

    其实上面大家的讨论基本是明了的。
    将代码稍微修改如下:
    class A
    {
    public static int X;
    static A() //第二步
    {
    X = B.Y + 1;
    }
    }
     
    class B
    {
    public static int Y = A.X + 1; //第一步
    static B() //第三步
    {
    string s= "dd";
    s +="ee";

    }
    static void Main() 
    {
    Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);
    }
    }搂住可以自己debug下看看,问题的理解我感觉应该在B类着手
    因为B类中包含main函数所以程序一定从B类开始执行,而从B类开始执行的时候
    并不限其他包含静态构造函数的类那样----"在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类"
    ,而是先对B类中的字段变量赋值,从而导致A类静态函数的执行,而在A类中用到的B.Y系统默认就是0,而且执行源来自包含Main函数的B类,所以并不回回去执行B的构造函数,而当B类中字段执行完之后,将进入B类的构造函数,然后执行B类的Main函数输出结果,不知道这样说楼住应该理解了吧
      

  19.   

    yangxd_yi(杨一) 
    所说的
    在A类的A()静态构造内
    X=B.Y+1时 B.Y并没有调用B()静态构造
    而是获得的默认0 为什么??????
    根据静态构造运行的定义看 此时应该调用B()啊 因为X=B.Y+1调用了Y这个静态成员啊
    *************************
    类的静态构造函数在给定应用程序域中至多执行一次:只有创建类的实例或者引用类的任何静态成员才激发静态构造函数
    *********************
      

  20.   

    我的疑惑就是执行这句:a = B.b + 1时,B.b的值应该要等到B的静态构造函数执行完才能取得,就像b = A.a+1一样,为什么在a = B.b + 1时它就可以不等B的构造函数执行完毕呢?