using System;
class A //定义类A
{
public static int X;
static A()
{
X = B.Y + 1; }
}//定义类B
class B
{
public static int Y = A.X + 1;
static B() { }
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.X, B.Y);//2,1
}
}
//为什么输出是x=1,y=2,请解释一下程序的运行过程!
class A //定义类A
{
public static int X;
static A()
{
X = B.Y + 1; }
}//定义类B
class B
{
public static int Y = A.X + 1;
static B() { }
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.X, B.Y);//2,1
}
}
//为什么输出是x=1,y=2,请解释一下程序的运行过程!
解决方案 »
- 关于panel 隐藏 控件 dock 问题,保证很少见!
- WPF中Path和PolyLine转换
- .net(C#)有没有好的操作com口的控件啊?
- 急救:使用sql2005时,用windows验证方式可以连接上数据库,用sqlserver连接时说找不到sa用户名,怎么办?
- vs2005C#的登陆窗口问题?
- 关于字符串的问题,请各位大哥帮忙啊,急!!
- 救命啊,毕业设计的问题。。。总报无效的对象,就这点分,都给你们了~
- 急!怎样调用C#编写的dll中的类啊?
- 怎样使数据库的时间类型结果修改为""
- 如何在C#中实现VB redim 2D 数组,我写了一个一维的,请高手指教. 先顶有分!
- 关于dataset显示数据的问题
- 匹配上面的串的正则,但不要限定顺序,应该怎么弄?
所以public static int Y = A.X + 1; 的时候,A()把X变成了1(因为int类型的B.Y还没有完成初始化,所以还是默认的初始值0,于是有了A=0+1=1)然后返回给B,此时Y就成了1+1=2,
所以,输出的时候成了1,2
类型构造函数(也称为类构造函数或静态构造函数)用于初始化类型。CLR 在创建类型的第一个实例或调用类型上的任何静态成员之前调用类型构造函数。如果类型构造函数不是私有的,则它可由 CLR 以外的代码调用。根据在构造函数中执行的操作的不同,这可能导致意外行为。 其次要理解C#中静态变量的初始化时机
C#在编译后,将静态变量的初始化总是在静态构造函数调用时进行,并保证在第一行代码前调用,因此以上代码可以改成
using System;
class A //定义类A
{
public static int X;
static A()
{
X = B.Y + 1; }
} class B
{
public static int Y ;
static B()
{
Y = A.X + 1;
}
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.X, B.Y);//2,1
}
}
因此也就很好理解了,首先是类申明时,静态变量均在类申明中此时
X=0 Y=0
然后当调用B的静态成员Main之前,CLR会调用static B
此时 会调用Y = A.X +1 而此句话导到类A的静态构造函数调用
如是有X=1 Y=2