在百度知道里看到的提问和答案
c#中关于static的问题,为什么下面的代码得出Y的值为3, x的值为1
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()
{
y=y+1;
}
static void Main()
{
Console.WriteLine("x={0},y={1}",A.x,B.y);
//Console.ReadLine();
}
}
答案
namespace StaticTest
{
class Program
{
static void Main()
{
Console.WriteLine("x={0},y={1}", A.x, B.y);
Console.ReadLine();
}
}
class A
{
public static int x;
static A()
{
x = B.y + 1;
}
}
class B
{
public static int y = A.x + 1;
static B()
{
y = y + 1;
}
}
}
要知道为什么会得出这样的结果,首先要了解类的静态构造在何时执行。
1.在类实例化对象时静态构造自动执行;
2.在调用类的静态变量时静态构造自动执行;
这是我所知道的。下面说说这个程序的执行过程:
Console.WriteLine("x={0},y={1}", A.x, B.y);
1)从这语句得知它首先调用的是A类的x静态变量,
这里符合上面所提的第二种情况,即(在调用类的静态变量时静态构造自动执行)
2)static A()
{
x = B.y + 1;
}
此时将执行x = B.y + 1;
这里调用了B类的y静态变量, (这里也符合第二种情况)
3)public static int y = A.x + 1; (x=B.y+1;未执行完,因此 A.x 此时为默认值 即0,而y的值为1.)
4)static B()
{
y = y + 1; //y的值为2
}
5)由此就可以得知x = B.y + 1; 计算结果为3
Console.WriteLine("x={0},y={1}", A.x, B.y); x=3,y=2