C# 之静态构造器与静态字段初始化器
public class Test
{
/// <summary>
/// 静态字段初始化器会在调用静态构造器前运行。
/// 如果类型没有静态构造器,字段会在类型被使用前或运行时中更早的时间进行初始化.
/// 静态字段初始化器按照字段声明的先后顺序运行。
/// </summary>
public static int X = Y;//静态字段初始化器
public static int Y = 3;//静态字段初始化器
public static int Z = 6;//静态字段初始化器
public static int ZX = Z;//静态字段初始化器
/// <summary>
/// 静态构造器,一个类型只能定义一个静态构造器,名称必须和类名相同,且没有参数。
/// 运行时将在类型使用之前调用静态构造器,以下两种行为可以触发静态构造器执行:
/// ·实例化类型
/// ·访问类型的静态成员
/// </summary>
static Test()
{
Console.WriteLine("Test Type Initialized");
}
public Test()
{
Console.WriteLine("This is Initalize function");
}
}
class ProgramA
{
static void Main()
{
Test t = new Test();
Console.WriteLine("X is "+Test.X);
Console.ReadLine();
}
}
OUTPUT:
Test Type Initialized
This is Initalize function
X is 0
输出结果正证实了:静态构造器只会执行一次。
class ProgramA
{
static void Main()
{
Console.WriteLine("Z is " + Test.Z);
Console.WriteLine("ZX is "+Test.ZX);
Console.ReadLine();
}
}
output:
Test Type Initialized
Z is 6
ZX is 6
输出结果正证实了:静态字段初始化器是按照顺序进行的。
class Foo
{
/// <summary>
/// 静态字段初始化器按照声明顺序运行
/// </summary>
public static Foo Instance = new Foo();
public static int X = 3;
Foo()
{
Console.WriteLine(X);
}
}
class ProgramA
{
static void Main()
{
//静态字段初始化器在类型使用前就运行,所以首先是运行Instance,
//而Instance正好调用了实例构造函数,而实例构造函数打印X,而此时,
//X还没有赋值,所以打印出0,而后,才初始化X为3,再在Main()函数中打印出X,即3
Console.WriteLine(Foo.X);
Console.ReadLine();
}
}
output:
0
3
#####
愿你一寸一寸地攻城略地,一点一点地焕然一新
#####