这是一道笔试题namespace ConsoleApplication1
{
class A
{
public static int x;
static A()
{
x = B.y + 1;
}
}
class B
{
public static int y = A.x + 1; }
class Program
{ static void Main(string[] args)
{
Console.WriteLine("x={0},y={1}", A.x, B.y);
Console.ReadKey();
}
}
}经过调试发现首先执行public static int y = A.x + 1; 结果是y = 0;然后执行x = B.y + 1;结果是x=1,最后又回到public static int y = A.x + 1;执行结果是y=2.
{
class A
{
public static int x;
static A()
{
x = B.y + 1;
}
}
class B
{
public static int y = A.x + 1; }
class Program
{ static void Main(string[] args)
{
Console.WriteLine("x={0},y={1}", A.x, B.y);
Console.ReadKey();
}
}
}经过调试发现首先执行public static int y = A.x + 1; 结果是y = 0;然后执行x = B.y + 1;结果是x=1,最后又回到public static int y = A.x + 1;执行结果是y=2.
一开始先调用A的构造函数,同时变量x也出来了,默认值是0,然后函数里面用到了类B,所以掉用了B的构造函数,然后使用到了类A的静态变量x,这个变量之前已经被创建了,值是0,所以这时候y的值是0+1=1,接着回头把1返回给类A使用,最后x的值就变为1+1=2了。
2. 类的静态构造函数
3. 类的实例变量定义时的赋值语句
4. 类的实例构造函数在这里,没有创建对象,所以 3、4 忽略。
1. 程序按照顺序初始化 A、B 的静态变量。
这里:public static int y = A.x + 1; A.x 这个时候是 0!
然后初始化完,变成 1;所以 y = 1
2. 接着初始化 A 的构造函数,静态构造函数是在第一次调用静态变量的时候初始化的。所以,在做:
Console.WriteLine("x={0},y={1}", A.x, B.y);
这句话的时候触发了静态构造函数的调用,使得 x = 2
b.y调用a的默认构造函数
{
public static int x;
static A()//这是啥
{
x = B.y + 1;
}
}}
class B
{
public static int y = A.x + 1;
}
的il代码里,把=A.x + 1放到static的构造函数里了.method private hidebysig specialname rtspecialname static
void .cctor() cil managed
{
// 代码大小 13 (0xd)
.maxstack 8
IL_0000: ldsfld int32 ConsoleApplication1.A::x
IL_0005: ldc.i4.1
IL_0006: add
IL_0007: stsfld int32 ConsoleApplication1.B::y
IL_000c: ret
} // end of method B::.cctor
而A的构造函数是:
.method private hidebysig specialname rtspecialname static
void .cctor() cil managed
{
// 代码大小 14 (0xe)
.maxstack 8
IL_0000: nop
IL_0001: ldsfld int32 ConsoleApplication1.B::y
IL_0006: ldc.i4.1
IL_0007: add
IL_0008: stsfld int32 ConsoleApplication1.A::x
IL_000d: ret
} // end of method A::.cctor
namespace ConsoleApplication1
{
class A
{
public static int x;
static A()
{
x = B.y + 1;
}
}
class B
{
public static int y;
static B()
{
y = A.x + 1;
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("x={0},y={1}", A.x, B.y);
Console.ReadKey();
}
}访问A.x时,A()被执行,执行到x = B.y + 1时,B()被执行,此时x为0,所以y=1,然后x=1+1
最后结果是x2 y1
2、是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。 3、一个类只能有一个静态构造函数。 4、无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。 5、最多只运行一次。 6、静态构造函数不可以被继承。 7、如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
说明B的构造函数要优先执行那结果为x=1,y=2就可以理解了
参考beforefieldinit的解释:
http://www.cnblogs.com/foundation/archive/2008/11/06/1327927.html可惜不能编辑前面的回复