静态构造函数
http://tech.ddvip.com/2009-02/1235012605109159.html
refer to : http://space.itpub.net/12639172/viewspace-462842
C# 对象初始化
1. 先变量后构造函数。变量先被初始化 ,然后构造函数被执行
2. 先静态化后实例化。 当 一个类被访问时 ,静态变量和构造函数最先被初始化 .接着是对象的实例化变量和构造函数被初始化
3. 先派生类后基类。对于变量和静态构造函数 ,派生对象在基对象之前被初始化 .比如 C类派生自 B类 ,B类派生自 A类 ,那么变量和静态构造函数被初始化次序是 C-B-A.
4. 除了实例构造函数。对于实例构造函数 ,基类构造函数在派生类构造函数之前执行 ,实例构造函数被执行次序是 A-B-C.
5. 不要假定变量的次序。 Fields依据它们在源文件中的声明的顺序依次初始化 .然而 ,自从程序员 和工具可以随意安排变量的声明后 ,你不应该在依靠变量任何特别的次序初始化
6. 对虚方法用两个阶段的构建。避免从一个构造器调用虚方法 .如果在初始化一个对象时需要调用一些虚方法 ,应在完整构造该对象的地方使用两阶段的构建,并随后调用已构造对象的初始化方法。
refer to : http://blog.sina.com.cn/s/blog_55100f7901000c6i.html
{
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);
}
}
using System;
class A
{
public static int X;
static A()
{
X = B.Y + 1;
}
static void Main(string[] args)
{
Console.WriteLine("A.X:{0}/tB.Y:{1}", A.X, B.Y);
Console.Read();
}
}
class B
{
public static int Y = A.X + 1;
static B();
{
}
}
上面这个例子的结果是什么呢???
他的执行顺序应该是
1、public static int X;
2、static A(){X = B.Y + 1;}
3、public static int Y = A.X + 1;
4、static B();
没错,结果就是 2,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();
{
}
}
class C
{
static void Main(string[] args)
{
Console.WriteLine("A.X:{0}/tB.Y:{1}", A.X, B.Y);
Console.Read();
}
}
结果是什么呢?
他的执行顺序应该是
1、public static int X;
2、static A(){X = B.Y + 1;}
3、public static int Y = A.X + 1;
4、static B();
没错,结果还是 2,1,因为先用到的A后用到的B嘛!
refer to :http://www.soidc.net/articles/1213781277395/20060906/1214037779788_1.html
分析此类问题,只要记住三点就行了。
第一代码的执行顺序,代码在前的先执行;
第二静态成员初始化语句要先于静态构造函数执行;
第三静态成员初始化语句与静态构造函数只执行一次。